Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/updater.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/vimeo/psalm')
-rw-r--r--vendor/vimeo/psalm/LICENSE21
-rw-r--r--vendor/vimeo/psalm/composer.json134
-rw-r--r--vendor/vimeo/psalm/config.xsd708
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap.php16820
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php76
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php230
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php72
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php50
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php1683
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php1133
-rw-r--r--vendor/vimeo/psalm/dictionaries/CallMap_historical.php16618
-rw-r--r--vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php65
-rw-r--r--vendor/vimeo/psalm/dictionaries/PropertyMap.php542
-rwxr-xr-xvendor/vimeo/psalm/psalm7
-rwxr-xr-xvendor/vimeo/psalm/psalm-language-server7
-rwxr-xr-xvendor/vimeo/psalm/psalm-plugin7
-rwxr-xr-xvendor/vimeo/psalm/psalm-refactor7
-rwxr-xr-xvendor/vimeo/psalm/psalter7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Aliases.php74
-rw-r--r--vendor/vimeo/psalm/src/Psalm/CodeLocation.php392
-rw-r--r--vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php30
-rw-r--r--vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php35
-rw-r--r--vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php33
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Codebase.php2013
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config.php2403
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/Creator.php296
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php68
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php559
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php174
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Context.php855
-rw-r--r--vendor/vimeo/psalm/src/Psalm/DocComment.php245
-rw-r--r--vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php331
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/FileManipulation.php83
-rw-r--r--vendor/vimeo/psalm/src/Psalm/FileSource.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php630
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php457
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php174
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php394
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php162
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php2638
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php648
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php343
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php391
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php90
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php682
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php124
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php978
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php384
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php2023
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php147
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php175
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php290
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php1080
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php280
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php1527
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php529
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php182
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php210
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php190
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php1149
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php377
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php242
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php439
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php532
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php509
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php735
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php234
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php769
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php516
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php139
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php100
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php135
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php607
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php55
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php4122
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php1027
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php33
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php1540
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php342
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php1728
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php232
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php1373
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php89
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php432
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php134
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php411
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php530
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php124
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php1629
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php142
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php1620
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php957
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php282
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php1129
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php87
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php861
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php89
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php890
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php673
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php173
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php634
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php196
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php454
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php437
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php586
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php866
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php382
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php1136
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php642
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php1171
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php538
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php148
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php52
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php142
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php85
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php145
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php224
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php2060
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php1217
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php679
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php309
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php482
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php486
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php559
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php138
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php423
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php49
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php107
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php351
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php98
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php109
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php760
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php306
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php134
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php219
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php82
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php514
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php83
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php658
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php188
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php93
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php138
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php357
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php1076
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php76
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php118
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Clause.php295
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php323
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php1176
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php578
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php330
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php665
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php1644
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php61
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php2331
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php363
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php159
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php603
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php437
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php1255
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php1224
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php356
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php61
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php548
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php811
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php524
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php224
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Composer.php43
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php137
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php33
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php129
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php251
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php37
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php319
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php172
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php144
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php90
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php621
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php321
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php142
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php42
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php141
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php38
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php245
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php579
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php281
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php492
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php68
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php55
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php79
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php71
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php157
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php64
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php575
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php73
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php148
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php35
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php18
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php410
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php78
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php174
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php117
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php80
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php39
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php122
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php409
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php80
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php562
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php1861
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php450
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php332
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php697
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php1454
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php1151
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php650
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php35
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php252
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php84
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php41
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php86
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php86
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php98
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php152
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php120
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php76
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php115
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php182
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php138
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php75
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php163
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php1007
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php1320
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php184
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php131
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php117
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php139
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php205
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php126
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php148
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php170
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php133
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php133
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php399
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php141
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php138
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php140
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php33
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php138
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php66
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php55
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php142
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php331
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php499
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php287
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php68
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php105
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php96
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php76
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php298
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php68
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php98
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php76
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php80
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php42
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php102
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php170
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php47
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php41
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php131
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php30
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php84
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php129
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php143
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php51
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php163
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php115
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php31
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php64
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php72
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php74
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php82
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php538
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php108
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php36
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php44
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php147
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php300
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php117
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php228
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php398
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php86
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php50
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php87
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php74
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php53
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php314
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php480
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php1816
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php293
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php712
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php524
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php92
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php207
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php180
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php166
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php311
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php640
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php43
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php499
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php425
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php43
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php43
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php48
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php842
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php2554
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php1819
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php52
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php416
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php73
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php1249
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php35
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php99
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php1528
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php909
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php1336
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php511
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php45
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php31
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php50
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php410
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php89
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php134
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php37
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php7
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php18
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php84
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/Trace.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/IssueBuffer.php1029
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php67
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php85
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php86
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php26
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php71
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php80
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php113
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php120
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php142
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php77
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php89
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php146
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php70
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php87
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php69
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php81
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php29
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php23
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php31
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php33
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php31
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php24
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php30
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php223
-rw-r--r--vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php238
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php104
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php110
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Progress/Progress.php69
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report.php101
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php39
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php84
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php149
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/CountReport.php39
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php72
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php28
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php175
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php99
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php49
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php135
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php47
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/TextReport.php29
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php52
-rw-r--r--vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php209
-rw-r--r--vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php111
-rw-r--r--vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php81
-rw-r--r--vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php8
-rw-r--r--vendor/vimeo/psalm/src/Psalm/StatementsSource.php64
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php105
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php47
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php62
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php491
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php12
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php103
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php161
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php304
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php9
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php17
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php107
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php135
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type.php761
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic.php812
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php300
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php294
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php109
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php13
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php49
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php95
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php49
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php44
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php36
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php44
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php30
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php81
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php171
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php251
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php44
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php19
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php148
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php46
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php29
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php51
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php34
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php59
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php115
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php71
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php57
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php161
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php129
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php105
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php434
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php209
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php105
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php45
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php55
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php16
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php52
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php160
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php40
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php20
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php21
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php22
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php15
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php14
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php39
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php37
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php34
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php42
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php287
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php41
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php39
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php43
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php10
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php32
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php66
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php63
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php135
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php65
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php55
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php27
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php88
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php80
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php41
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php50
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php1110
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php25
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php11
-rw-r--r--vendor/vimeo/psalm/src/Psalm/Type/Union.php1668
-rw-r--r--vendor/vimeo/psalm/src/command_functions.php88
-rw-r--r--vendor/vimeo/psalm/src/functions.php13
-rw-r--r--vendor/vimeo/psalm/src/psalm-language-server.php10
-rw-r--r--vendor/vimeo/psalm/src/psalm-refactor.php10
-rw-r--r--vendor/vimeo/psalm/src/psalm.php10
-rw-r--r--vendor/vimeo/psalm/src/psalm_plugin.php10
-rw-r--r--vendor/vimeo/psalm/src/psalter.php10
-rw-r--r--vendor/vimeo/psalm/src/spl_object_id.php54
-rw-r--r--vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub503
-rw-r--r--vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub1368
-rw-r--r--vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub1094
-rw-r--r--vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub242
-rw-r--r--vendor/vimeo/psalm/stubs/DOM.phpstub176
-rw-r--r--vendor/vimeo/psalm/stubs/Php80.phpstub105
-rw-r--r--vendor/vimeo/psalm/stubs/Php81.phpstub91
-rw-r--r--vendor/vimeo/psalm/stubs/Reflection.phpstub148
-rw-r--r--vendor/vimeo/psalm/stubs/SPL.phpstub972
-rw-r--r--vendor/vimeo/psalm/stubs/Xdebug.phpstub43
-rw-r--r--vendor/vimeo/psalm/stubs/decimal.phpstub492
-rw-r--r--vendor/vimeo/psalm/stubs/ext-apcu.phpstub92
-rw-r--r--vendor/vimeo/psalm/stubs/ext-ds.phpstub1434
-rw-r--r--vendor/vimeo/psalm/stubs/ext-geos.phpstub25
-rw-r--r--vendor/vimeo/psalm/stubs/mongodb.phpstub59
-rw-r--r--vendor/vimeo/psalm/stubs/mysqli.phpstub33
-rw-r--r--vendor/vimeo/psalm/stubs/pdo.phpstub19
-rw-r--r--vendor/vimeo/psalm/stubs/phpparser.phpstub22
-rw-r--r--vendor/vimeo/psalm/stubs/phpredis.phpstub548
-rw-r--r--vendor/vimeo/psalm/stubs/soap.phpstub284
1120 files changed, 0 insertions, 201728 deletions
diff --git a/vendor/vimeo/psalm/LICENSE b/vendor/vimeo/psalm/LICENSE
deleted file mode 100644
index bfb2d1c..0000000
--- 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 ddbe93f..0000000
--- 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 e942fcb..0000000
--- a/vendor/vimeo/psalm/config.xsd
+++ /dev/null
@@ -1,708 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<xs:schema
- xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns="https://getpsalm.org/schema/config"
- targetNamespace="https://getpsalm.org/schema/config"
- elementFormDefault="qualified"
->
- <xs:element name="psalm" type="PsalmType" />
-
- <xs:complexType name="PsalmType">
- <xs:choice maxOccurs="unbounded">
- <xs:element name="projectFiles" type="ProjectFilesType" minOccurs="1" maxOccurs="1" />
- <xs:element name="extraFiles" type="ProjectFilesType" minOccurs="0" maxOccurs="1" />
- <xs:element name="taintAnalysis" type="TaintAnalysisType" minOccurs="0" maxOccurs="1" />
- <xs:element name="fileExtensions" type="FileExtensionsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="mockClasses" type="MockClassesType" minOccurs="0" maxOccurs="1" />
- <xs:element name="stubs" type="StubsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="plugins" type="PluginsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="exitFunctions" type="ExitFunctionsType" minOccurs="0" maxOccurs="1">
- <xs:annotation>
- <!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
- <xs:documentation xml:lang="en">
- Deprecated. Replaced by documenting never as a return type. It is going to be removed in Psalm 5.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
- <xs:element name="forbiddenFunctions" type="ExitFunctionsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="issueHandlers" type="IssueHandlersType" minOccurs="0" maxOccurs="1" />
- <xs:element name="ignoreExceptions" type="ExceptionsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="globals" type="GlobalsType" minOccurs="0" maxOccurs="1" />
- <xs:element name="universalObjectCrates" type="UniversalObjectCratesType" minOccurs="0" maxOccurs="1" />
- </xs:choice>
-
- <xs:attribute name="autoloader" type="xs:string" />
- <xs:attribute name="cacheDirectory" type="xs:string" />
- <xs:attribute name="errorBaseline" type="xs:string" />
- <xs:attribute name="maxStringLength" type="xs:string" />
- <xs:attribute name="maxShapedArraySize" type="xs:string" default="100" />
- <xs:attribute name="name" type="xs:string" />
- <xs:attribute name="phpVersion" type="xs:string" />
- <xs:attribute name="serializer" type="xs:string" />
-
- <xs:attribute name="addParamDefaultToDocblockType" type="xs:boolean" default="false" />
-
- <xs:attribute name="allowCoercionFromStringToClassConst" type="xs:boolean" default="false">
- <xs:annotation>
- <!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
- <xs:documentation xml:lang="en">
- Deprecated. Has no effect since Psalm 3 and is going to be removed in Psalm 5.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
-
- <xs:attribute name="allowFileIncludes" type="xs:boolean" default="true" />
- <xs:attribute name="allowPhpStormGenerics" type="xs:boolean" default="false">
- <xs:annotation>
- <!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
- <xs:documentation xml:lang="en">
- Deprecated. PHPStorm now supports generics for the most part and @psalm- annotations can be used
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="allowStringToStandInForClass" type="xs:boolean" default="false" />
- <xs:attribute name="checkForThrowsDocblock" type="xs:boolean" default="false" />
- <xs:attribute name="checkForThrowsInGlobalScope" type="xs:boolean" default="false" />
- <xs:attribute name="ensureArrayIntOffsetsExist" type="xs:boolean" default="false" />
- <xs:attribute name="ensureArrayStringOffsetsExist" type="xs:boolean" default="false" />
- <xs:attribute name="findUnusedCode" type="xs:boolean" default="false" />
- <xs:attribute name="findUnusedVariablesAndParams" type="xs:boolean" default="false" />
- <xs:attribute name="findUnusedPsalmSuppress" type="xs:boolean" default="false" />
- <xs:attribute name="forbidEcho" type="xs:boolean" default="false">
- <xs:annotation>
- <xs:documentation xml:lang="en">
- Deprecated. Will be replaced by adding echo to forbiddenFunctions in Psalm 5.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="hideExternalErrors" type="xs:boolean" default="false" />
- <xs:attribute name="hoistConstants" type="xs:boolean" default="false" />
- <xs:attribute name="ignoreInternalFunctionFalseReturn" type="xs:boolean" default="true" />
- <xs:attribute name="ignoreInternalFunctionNullReturn" type="xs:boolean" default="true" />
- <xs:attribute name="includePhpVersionsInErrorBaseline" type="xs:boolean" default="false" />
- <xs:attribute name="inferPropertyTypesFromConstructor" type="xs:boolean" default="true" />
- <xs:attribute name="loadXdebugStub" type="xs:boolean">
- <xs:annotation>
- <xs:documentation xml:lang="en">
- Default is runtime-specific: if not present, Psalm will only load the Xdebug stub if psalm has unloaded the extension.
- </xs:documentation>
-
- <!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
- <xs:documentation xml:lang="en">
- Deprecated. In Psalm 5 extensions will be loaded based on composer.json and overridden with enableExtensions/disableExtensions.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="memoizeMethodCallResults" type="xs:boolean" default="false" />
- <xs:attribute name="rememberPropertyAssignmentsAfterCall" type="xs:boolean" default="true" />
- <xs:attribute name="resolveFromConfigFile" type="xs:boolean" default="true" />
- <xs:attribute name="strictBinaryOperands" type="xs:boolean" default="false" />
- <xs:attribute name="throwExceptionOnError" type="xs:boolean" default="false" />
- <xs:attribute name="totallyTyped" type="xs:boolean" default="false">
- <xs:annotation>
- <xs:documentation xml:lang="en">
- 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"`
- </xs:documentation>
-
- <!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
- <xs:documentation xml:lang="en">
- Deprecated. Replaced by `errorLevel` and `reportMixedIssues`.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="disableVarParsing" type="xs:boolean" default="false" />
- <xs:attribute name="errorLevel" type="xs:integer" default="2" />
- <xs:attribute name="reportMixedIssues" type="xs:boolean" default="true" />
- <xs:attribute name="useDocblockTypes" type="xs:boolean" default="true" />
- <xs:attribute name="useDocblockPropertyTypes" type="xs:boolean" default="false" />
- <xs:attribute name="usePhpDocMethodsWithoutMagicCall" type="xs:boolean" default="false" />
- <xs:attribute name="usePhpDocPropertiesWithoutMagicCall" type="xs:boolean" default="false" />
- <xs:attribute name="skipChecksOnUnresolvableIncludes" type="xs:boolean" default="false" />
- <xs:attribute name="sealAllMethods" type="xs:boolean" default="false" />
- <xs:attribute name="sealAllProperties" type="xs:boolean" default="false" />
- <xs:attribute name="runTaintAnalysis" type="xs:boolean" default="false" />
- <xs:attribute name="usePhpStormMetaPath" type="xs:boolean" default="true" />
- <xs:attribute name="allowInternalNamedArgumentCalls" type="xs:boolean" default="true" />
- <xs:attribute name="allowNamedArgumentCalls" type="xs:boolean" default="true" />
- <xs:attribute name="reportInfo" type="xs:boolean" default="true" />
- <xs:attribute name="restrictReturnTypes" type="xs:boolean" default="false" />
- <xs:attribute name="limitMethodComplexity" type="xs:boolean" default="false" />
- <xs:attribute name="disableSuppressAll" type="xs:boolean" default="false" />
- <xs:attribute name="triggerErrorExits" type="TriggerErrorExitsType" default="default" />
- <xs:attribute name="threads" type="xs:integer" />
- </xs:complexType>
-
- <xs:complexType name="ProjectFilesType">
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="ProjectDirectoryAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="ignoreFiles" minOccurs="0" maxOccurs="1" type="IgnoreFilesType" />
- </xs:choice>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="TaintAnalysisType">
- <xs:choice maxOccurs="unbounded">
- <xs:element name="ignoreFiles" minOccurs="0" maxOccurs="1" type="IgnoreFilesType" />
- </xs:choice>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="NameAttributeType">
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="StubsAttributeType">
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:attribute name="preloadClasses" type="xs:boolean" default="false" />
- </xs:complexType>
-
- <xs:complexType name="IgnoreFilesType">
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="allowMissingFiles" type="xs:string" />
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="ProjectDirectoryAttributeType">
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:attribute name="ignoreTypeStats" type="xs:string" />
- <xs:attribute name="useStrictTypes" type="xs:string" />
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="FileExtensionsType">
- <xs:sequence>
- <xs:element name="extension" maxOccurs="unbounded">
- <xs:complexType>
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:attribute name="scanner" type="xs:string" />
- <xs:attribute name="checker" type="xs:string" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="MockClassesType">
- <xs:sequence>
- <xs:element name="class" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="UniversalObjectCratesType">
- <xs:sequence>
- <xs:element name="class" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="ExceptionsType">
- <xs:sequence>
- <xs:element name="class" minOccurs="0" maxOccurs="unbounded" type="ExceptionType" />
- <xs:element name="classAndDescendants" minOccurs="0" maxOccurs="unbounded" type="ExceptionType" />
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="StubsType">
- <xs:sequence>
- <xs:element name="file" maxOccurs="unbounded" type="StubsAttributeType" />
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="ExitFunctionsType">
- <xs:sequence>
- <xs:element name="function" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:sequence>
- <xs:anyAttribute processContents="skip"/>
- </xs:complexType>
-
- <xs:complexType name="PluginsType">
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="plugin">
- <xs:complexType>
- <xs:attribute name="filename" type="xs:string" use="required" />
- </xs:complexType>
- </xs:element>
- <xs:element name="pluginClass">
- <xs:complexType>
- <xs:sequence>
- <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
- </xs:sequence>
- <xs:attribute name="class" type="xs:string" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:choice>
- <xs:anyAttribute/>
- </xs:complexType>
-
- <xs:complexType name="IssueHandlersType">
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="PluginIssue" type="PluginIssueHandlerType" minOccurs="0" />
- <xs:element name="AbstractInstantiation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="AbstractMethodCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ArgumentTypeCoercion" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="AssignmentToVoid" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="CircularReference" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ComplexFunction" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ComplexMethod" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ConfigIssue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ConflictingReferenceConstraint" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ConstructorSignatureMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ContinueOutsideLoop" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedConstant" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedFunction" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedInterface" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedProperty" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="DeprecatedTrait" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DocblockTypeContradiction" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateArrayKey" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateClass" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateConstant" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateEnumCase" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateEnumCaseValue" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateFunction" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="DuplicateParam" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="EmptyArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ExtensionRequirementViolation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="FalsableReturnStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="FalseOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ForbiddenCode" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ForbiddenEcho" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="IfThisIsMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImplementationRequirementViolation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImplementedParamTypeMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImplementedReturnTypeMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImplicitToStringCast" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureByReferenceAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureMethodCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpurePropertyAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpurePropertyFetch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureStaticProperty" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureStaticVariable" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ImpureVariable" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InaccessibleClassConstant" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InaccessibleMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="InaccessibleProperty" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InterfaceInstantiation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InternalClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InternalMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="InternalProperty" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidArrayAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidAttribute" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidCast" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidCatch" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidClone" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidDocblock" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidDocblockParamName" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidEnumBackingType" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidEnumCaseValue" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidExtendClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidFalsableReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidGlobal" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidIterator" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidLiteralArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidMethodCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidNamedArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidNullableReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidParamDefault" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidParent" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidPassByReference" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidPropertyAssignmentValue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidPropertyFetch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidReturnStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidScalarArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidScope" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidStaticInvocation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidStringClass" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidTemplateParam" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidThrow" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidToString" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidTraversableImplementation" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="InvalidTypeImport" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="LessSpecificImplementedReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="LessSpecificReturnStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="LessSpecificReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="LoopInvalidation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MethodSignatureMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MethodSignatureMustOmitReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MethodSignatureMustProvideReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MismatchingDocblockParamType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MismatchingDocblockPropertyType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MismatchingDocblockReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingClosureParamType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingClosureReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingConstructor" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingDependency" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingDocblockType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingFile" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingImmutableAnnotation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingParamType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingPropertyType" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="MissingReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingTemplateParam" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MissingThrowsDocblock" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArgumentTypeCoercion" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArrayAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedArrayTypeCoercion" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedClone" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="MixedFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedInferredReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedMethodCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedPropertyFetch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedPropertyTypeCoercion" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="MixedReturnStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedReturnTypeCoercion" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MixedStringOffsetAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MoreSpecificImplementedParamType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MoreSpecificReturnType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="MutableDependency" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="NamedArgumentNotAllowed" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="NoEnumProperties" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="NoInterfaceProperties" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="NonStaticSelfCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NoValue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NonInvariantDocblockPropertyType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NonInvariantPropertyType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullableReturnStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="NullArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullIterator" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="NullPropertyAssignment" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="NullPropertyFetch" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="NullReference" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="OverriddenMethodAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="OverriddenPropertyAccess" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="ParadoxicalCondition" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ParamNameMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ParentNotFound" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossibleRawObjectIteration" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyFalseArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyFalseIterator" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyFalseOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyFalsePropertyAssignmentValue" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyFalseReference" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidArrayAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidCast" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidClone" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidDocblockTag" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidIterator" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidMethodCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidPropertyAssignmentValue" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyInvalidPropertyFetch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullArgument" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullArrayAccess" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullArrayAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullIterator" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullOperand" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullPropertyAssignment" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullPropertyAssignmentValue" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullPropertyFetch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyNullReference" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedGlobalVariable" type="VariableIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedIntArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedStringArrayOffset" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUndefinedVariable" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUnusedMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUnusedParam" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUnusedProperty" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="PossiblyUnusedReturnValue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="PropertyNotSetInConstructor" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="PropertyTypeCoercion" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="RawObjectIteration" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantCast" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantCastGivenDocblockType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantCondition" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantConditionGivenDocblockType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantFunctionCall" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantFunctionCallGivenDocblockType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantPropertyInitializationCheck" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="RedundantIdentityWithTrue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ReferenceConstraintViolation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="ReservedWord" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="StringIncrement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedCallable" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedCookie" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedCustom" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedEval" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedFile" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedHeader" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedHtml" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedInclude" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedInput" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedLdap" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedShell" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedSql" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedSSRF" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedSystemSecret" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedTextWithQuotes" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedUnserialize" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TaintedUserSecret" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TooFewArguments" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="TooManyArguments" type="ArgumentIssueHandlerType" minOccurs="0" />
- <xs:element name="TooManyTemplateParams" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="Trace" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TraitMethodSignatureMismatch" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TypeDoesNotContainNull" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="TypeDoesNotContainType" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UncaughtThrowInGlobalScope" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedAttributeClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedConstant" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedDocblockClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedFunction" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedGlobalVariable" type="VariableIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedInterface" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedInterfaceMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedMagicMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedMagicPropertyAssignment" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedMagicPropertyFetch" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedPropertyAssignment" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedPropertyFetch" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedThisPropertyAssignment" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedThisPropertyFetch" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedTrace" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedTrait" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UndefinedVariable" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnevaluatedCode" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnhandledMatchCondition" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnimplementedAbstractMethod" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnimplementedInterfaceMethod" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UninitializedProperty" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UnnecessaryVarAnnotation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnrecognizedExpression" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnrecognizedStatement" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnresolvableInclude" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnsafeInstantiation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnsafeGenericInstantiation" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedClass" type="ClassIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedClosureParam" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedConstructor" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedForeachValue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedFunctionCall" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedMethod" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedMethodCall" type="MethodIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedParam" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedProperty" type="PropertyIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedPsalmSuppress" type="FunctionIssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedReturnValue" type="IssueHandlerType" minOccurs="0" />
- <xs:element name="UnusedVariable" type="IssueHandlerType" minOccurs="0" />
- </xs:choice>
- <xs:anyAttribute/>
- </xs:complexType>
-
- <xs:complexType name="IssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="PluginIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- <xs:attribute name="name" type="xs:string" use="required" />
- </xs:complexType>
-
- <xs:complexType name="MethodIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedMethod" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="FunctionIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedFunction" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="ArgumentIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedFunction" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="ClassIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedClass" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="PropertyIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedProperty" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="VariableIssueHandlerType">
- <xs:sequence>
- <xs:element name="errorLevel" minOccurs="0" maxOccurs="unbounded">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="directory" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="file" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- <xs:element name="referencedVariable" minOccurs="0" maxOccurs="unbounded" type="NameAttributeType" />
- </xs:choice>
-
- <xs:attribute name="type" type="ErrorLevelType" use="required" />
- </xs:complexType>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute name="errorLevel" type="ErrorLevelType" />
- </xs:complexType>
-
- <xs:complexType name="GlobalsType">
- <xs:sequence>
- <xs:element name="var" maxOccurs="unbounded" type="IdentifierType" />
- </xs:sequence>
- <xs:anyAttribute/>
- </xs:complexType>
-
- <xs:complexType name="IdentifierType">
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:attribute name="type" type="xs:string" use="required" />
- </xs:complexType>
-
- <xs:complexType name="ExceptionType">
- <xs:attribute name="name" type="xs:string" use="required" />
- <xs:attribute name="onlyGlobalScope" type="xs:string" />
- </xs:complexType>
-
- <xs:simpleType name="ErrorLevelType">
- <xs:restriction base="xs:string">
- <xs:enumeration value="error"/>
- <xs:enumeration value="info"/>
- <xs:enumeration value="suppress"/>
- </xs:restriction>
- </xs:simpleType>
-
- <xs:simpleType name="TriggerErrorExitsType">
- <xs:restriction base="xs:string">
- <xs:enumeration value="default"/>
- <xs:enumeration value="never"/>
- <xs:enumeration value="always"/>
- </xs:restriction>
- </xs:simpleType>
-</xs:schema>
diff --git a/vendor/vimeo/psalm/dictionaries/CallMap.php b/vendor/vimeo/psalm/dictionaries/CallMap.php
deleted file mode 100644
index 219e637..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap.php
+++ /dev/null
@@ -1,16820 +0,0 @@
-<?php // phpcs:ignoreFile
-namespace Phan\Language\Internal;
-
-/**
- * CURRENT PHP TARGET VERSION: 8.1
- * The version above has to match Psalm\Internal\Codebase\InternalCallMapHandler::PHP_(MAJOR|MINOR)_VERSION
- *
- * Format
- *
- * '<function_name>' => ['<return_type>, '<arg_name>'=>'<arg_type>']
- * alternative signature for the same function
- * '<function_name\'1>' => ['<return_type>, '<arg_name>'=>'<arg_type>']
- *
- * A '&' in front of the <arg_name> 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 <arg_name> 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_<arg_name>' 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_<arg_name>' 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 <arg_name> indicates this arg is optional.
- *
- * The <arg_name> can begin with '...' to indicate the arg is variadic.
- * '...args=' indicates it is both variadic and optional.
- *
- * Some reference arguments will have prefixes in <arg_name> 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<string,T1>|array<string,T2>
- *
- * - 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<string,int>', 'values'=>'array<string,mixed>', 'unused='=>'', 'ttl='=>'int'],
-'apcu_cache_info' => ['array<string,mixed>|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<string>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'ArithmeticError::getTraceAsString' => ['string'],
-'array_change_key_case' => ['associative-array', 'array'=>'array', 'case='=>'int'],
-'array_chunk' => ['list<array[]>', '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<mixed,int>', '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<int,mixed>', '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<mixed,int>|associative-array<mixed,string>', '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<string|int>', '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<int,int>|array<int,string>', '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<int|float|string|null>', 'array'=>'array<int|float|string|null>', 'flags='=>'1'],
-'array_unique\'2' => ['array<int|float|string|bool|\Stringable|null>', 'array'=>'array<int|float|string|bool|\Stringable|null>', 'flags='=>'2|5'],
-'array_unshift' => ['int', '&rw_array'=>'array', '...values='=>'mixed'],
-'array_values' => ['list<mixed>', '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<int,ast\Metadata>'],
-'ast\get_supported_versions' => ['array<int,int>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<mixed>'],
-'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<mixed>'],
-'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<string,string>|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'],
-'class_parents' => ['array<string, class-string>|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'],
-'class_uses' => ['array<string,string>|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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string, mixed>', '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<int,Couchbase\SearchQueryPart>'],
-'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array<int,Couchbase\SearchQueryPart>'],
-'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array<int,Couchbase\SearchQueryPart>'],
-'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<int,string>'],
-'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<int,Couchbase\SearchQueryPart>'],
-'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<int,Couchbase\SearchQueryPart>'],
-'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<int,string>'],
-'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<int,Couchbase\SearchQueryPart>'],
-'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<int,Couchbase\SearchQueryPart>'],
-'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array<int,string>'],
-'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'],
-'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array<int,string>'],
-'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<int,string>'],
-'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<int,string>'],
-'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<int,Couchbase\sort>'],
-'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<int,int>', '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<int,string>,error_count:int,errors:array<int,string>}'],
-'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<int,string>,error_count:int,errors:array<int,string>}'],
-'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<int,string>,error_count:int,errors:array<int,string>}'],
-'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<array{ts: int, time: string, offset: int, isdst: bool, abbr: string}>|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
-'DateTimeZone::listAbbreviations' => ['array<string, list<array{dst: bool, offset: int, timezone_id: string|null}>>|false'],
-'DateTimeZone::listIdentifiers' => ['list<string>', '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<array{file:string,line:int,function:string,class?:class-string,object?:object,type?:string,args?: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<array>|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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<int,array{lang_tag:string,provider_name:string,provider_desc:string,provider_file:string}>|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<int,string>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string>', '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<string>|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<string>|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<string>', '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<mixed>'],
-'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<array-key, null|scalar|Stringable>', '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<mixed>', '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<mixed>'],
-'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<string>', 'object_or_class'=>'object|class-string'],
-'get_class_vars' => ['array<string,mixed>', 'class'=>'string'],
-'get_current_user' => ['string'],
-'get_debug_type' => ['string', 'value'=>'mixed'],
-'get_declared_classes' => ['list<class-string>'],
-'get_declared_interfaces' => ['list<class-string>'],
-'get_declared_traits' => ['list<class-string>|null'],
-'get_defined_constants' => ['array<string,int|string|float|bool|null|array|resource>', 'categorize='=>'bool'],
-'get_defined_functions' => ['array<string,list<callable-string>>', 'exclude_disabled='=>'bool'],
-'get_defined_vars' => ['array'],
-'get_extension_funcs' => ['list<callable-string>|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<string>'],
-'get_loaded_extensions' => ['list<string>', '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<string,mixed>', 'object'=>'object'],
-'get_parent_class' => ['class-string|false', 'object_or_class='=>'object|class-string'],
-'get_required_files' => ['list<string>'],
-'get_resource_id' => ['int', 'resource'=>'resource'],
-'get_resource_type' => ['string', 'resource'=>'resource'],
-'get_resources' => ['array<int,resource>', '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<string,string>'],
-'gethostbyaddr' => ['string|false', 'ip'=>'string'],
-'gethostbyname' => ['string', 'hostname'=>'string'],
-'gethostbynamel' => ['list<string>|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<string,string>|array<string,false>|array<string,list<mixed>>|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<string, int>'],
-'gettimeofday\'1' => ['float', 'as_float='=>'true'],
-'gettype' => ['string', 'value'=>'mixed'],
-'glob' => ['list<string>|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<string,GMP>', '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<string>', '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<string>'],
-'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<string>'],
-'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<string>'],
-'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<int,int>', '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<int>', '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<int, array{mean:float, minima:float, maxima:float, standardDeviation:float, depth:int}>'],
-'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<ImagickPixel>'],
-'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<int|string, string>', '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<string, mixed>', '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<int>'],
-'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<string>', '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<float>'],
-'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<string>'],
-'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<string, float>'],
-'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<array{x:float, y:float}>'],
-'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<array{x:float, y:float}>'],
-'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list<array{x:float, y:float}>'],
-'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<int|float>'],
-'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<list<float>>', 'origin='=>'array'],
-'ImagickKernel::getMatrix' => ['list<list<float|false>>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<int,LibXMLError>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string>', '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<string>|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<string>'],
-'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<string>|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'],
-'mb_str_split' => ['list<string>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<mixed>|null'],
-'mysqli_fetch_all' => ['list<array<array-key,null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'3'],
-'mysqli_fetch_all\'1' => ['list<array<string,null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'1'],
-'mysqli_fetch_all\'2' => ['list<list<null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'2'],
-'mysqli_fetch_array' => ['array<array-key,null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'3'],
-'mysqli_fetch_array\'1' => ['array<string,null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'1'],
-'mysqli_fetch_array\'2' => ['list<null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'2'],
-'mysqli_fetch_assoc' => ['array<string,null|int|float|string>|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<null|int|float|string>|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<array<array-key,null|int|float|string>>', 'mode='=>'3'],
-'mysqli_result::fetch_all\'1' => ['list<array<string,null|int|float|string>>', 'mode='=>'1'],
-'mysqli_result::fetch_all\'2' => ['list<list<null|int|float|string>>', 'mode='=>'2'],
-'mysqli_result::fetch_array' => ['array<array-key,null|int|float|string>|false|null', 'mode='=>'3'],
-'mysqli_result::fetch_array\'1' => ['array<string,null|int|float|string>|false|null', 'mode='=>'1'],
-'mysqli_result::fetch_array\'2' => ['list<null|int|float|string>|false|null', 'mode='=>'2'],
-'mysqli_result::fetch_assoc' => ['array<string,null|int|float|string>|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<null|int|float|string>|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<mixed>|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<mixed>|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<string,array<string,mixed>>|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<string>'],
-'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<string>'],
-'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<OpenSSLCertificate|string>|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<OpenSSLAsymmetricKey>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string,mixed>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'PDOException::getTraceAsString' => ['string'],
-'PDOStatement::__sleep' => ['list<string>'],
-'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<array>', 'result'=>'\PgSql\Result', 'result_type='=>'int'],
-'pg_fetch_all_columns' => ['array', 'result'=>'\PgSql\Result', 'field='=>'int'],
-'pg_fetch_array' => ['array<string|null>|false', 'result'=>'\PgSql\Result', 'row='=>'?int', 'mode='=>'int'],
-'pg_fetch_assoc' => ['array<string, mixed>|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<PhpToken>', '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<string>}|false', 'group_id'=>'int'],
-'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list<string>}|false', 'name'=>'string'],
-'posix_getgroups' => ['list<int>|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<string, mixed>'],
-'Postal\Parser::parse_address' => ['array<string,string>', 'address'=>'string', 'options='=>'array<string, string>'],
-'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<string,callable(array):string>', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
-'preg_split' => ['list<string>|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'],
-'preg_split\'1' => ['list<string>|list<list<string|int>>|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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string, string>'],
-'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<string, string>', '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<string, string>'],
-'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<int,string>', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'],
-'Redis::geoPos' => ['array<int,array{0:string,1:string}>', 'key'=>'string', 'member'=>'string', '...members='=>'string'],
-'Redis::geoRadius' => ['array<int,mixed>|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array<string,mixed>'],
-'Redis::geoRadiusByMember' => ['array<int,mixed>|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array<string,mixed>'],
-'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<int,string>', '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<int,string>', '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<int,string>|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<int,string>', '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<int,string>', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'],
-'RedisCluster::geopos' => ['array<int,array{0:string,1:string}>', '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<string>', '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<string>', '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<string>', '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<string>', 'key1'=>'string', '...other_keys='=>'string'],
-'RedisCluster::sUnion\'1' => ['list<string>', '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<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
-'ReflectionClass::getConstant' => ['mixed', 'name'=>'string'],
-'ReflectionClass::getConstants' => ['array<string,mixed>', '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<class-string>'],
-'ReflectionClass::getInterfaces' => ['array<class-string, ReflectionClass>'],
-'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'],
-'ReflectionClass::getMethods' => ['list<ReflectionMethod>', 'filter='=>'int'],
-'ReflectionClass::getModifiers' => ['int'],
-'ReflectionClass::getName' => ['class-string'],
-'ReflectionClass::getNamespaceName' => ['string'],
-'ReflectionClass::getParentClass' => ['ReflectionClass|false'],
-'ReflectionClass::getProperties' => ['list<ReflectionProperty>', 'filter='=>'int'],
-'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'],
-'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'],
-'ReflectionClass::getReflectionConstants' => ['list<ReflectionClassConstant>', 'filter='=>'?int'],
-'ReflectionClass::getShortName' => ['string'],
-'ReflectionClass::getStartLine' => ['int|false'],
-'ReflectionClass::getStaticProperties' => ['array<string, ReflectionProperty>'],
-'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'],
-'ReflectionClass::getTraitAliases' => ['array<string,string>|null'],
-'ReflectionClass::getTraitNames' => ['list<trait-string>|null'],
-'ReflectionClass::getTraits' => ['array<trait-string,ReflectionClass>'],
-'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<array-key, mixed>'],
-'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<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
-'ReflectionClassConstant::getDeclaringClass' => ['ReflectionClass'],
-'ReflectionClassConstant::getDocComment' => ['string|false'],
-'ReflectionClassConstant::getModifiers' => ['int'],
-'ReflectionClassConstant::getName' => ['string'],
-'ReflectionClassConstant::getValue' => ['scalar|array<scalar>|null'],
-'ReflectionClassConstant::isPrivate' => ['bool'],
-'ReflectionClassConstant::isProtected' => ['bool'],
-'ReflectionClassConstant::isPublic' => ['bool'],
-'ReflectionEnum::getBackingType' => ['?ReflectionType'],
-'ReflectionEnum::getCase' => ['ReflectionEnumUnitCase', 'name' => 'string'],
-'ReflectionEnum::getCases' => ['list<ReflectionEnumUnitCase>'],
-'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<class-string,ReflectionClass>'],
-'ReflectionExtension::getClassNames' => ['list<class-string>'],
-'ReflectionExtension::getConstants' => ['array<string,mixed>'],
-'ReflectionExtension::getDependencies' => ['array<string,string>'],
-'ReflectionExtension::getFunctions' => ['array<string,ReflectionFunction>'],
-'ReflectionExtension::getINIEntries' => ['array<string,mixed>'],
-'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<ReflectionParameter>'],
-'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<ReflectionAttribute>', '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<ReflectionParameter>'],
-'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<string,mixed>'],
-'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<string,\ReflectionClass>'],
-'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<string,string>'],
-'ReflectionObject::getTraitNames' => ['list<string>'],
-'ReflectionObject::getTraits' => ['array<string,\ReflectionClass>'],
-'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<ReflectionAttribute>', '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<ReflectionAttribute>', '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<ReflectionNamedType>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string>|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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<int,string>', '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<int,string>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<callable(string):void>'],
-'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<string>|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<array-key, null|scalar|Stringable>', '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<string>|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<array-key, null|scalar|Stringable>', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
-'SplTempFileObject::fread' => ['false|string', 'length'=>'int'],
-'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array<int,float>|array<int,int>|array<int,string>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<float|int|string|null>|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'=>'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'=>'string', 'length='=>'positive-int'],
-'str_starts_with' => ['bool', 'haystack'=>'string', 'needle'=>'string'],
-'str_word_count' => ['array<int, string>|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<string>'],
-'stream_get_wrappers' => ['list<string>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string, list<array{dst: bool, offset: int, timezone_id: string|null}>>|false'],
-'timezone_identifiers_list' => ['list<string>', '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<array{ts: int, time: string, offset: int, isdst: bool, abbr: string}>|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'],
-'timezone_version_get' => ['string'],
-'tmpfile' => ['resource|false'],
-'token_get_all' => ['list<string|array{0:int,1:string,2:int}>', '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<string>'],
-'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<string>'],
-'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<string>'],
-'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<string>'],
-'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<string>'],
-'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<string>'],
-'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<string>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
-'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 8945144..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_71_delta.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 7.1 to php 7.0 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that did not exist prior to PHP 7.1
- * The 'removed' section contains the signatures that were removed in php 7.1.
- * The 'changed' section contains functions for which the signature has changed for php 7.1.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP before 7.1 and in PHP 7.1, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- '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<string,string>'],
- 'hash_hkdf' => ['string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'],
- 'is_iterable' => ['bool', 'value'=>'mixed'],
- 'openssl_get_curve_names' => ['list<string>'],
- '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<string>|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'],
- 'new' => ['list<string>|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<string,string>|array<string,false>|array<string,list<mixed>>|false', 'short_options'=>'string', 'long_options='=>'array'],
- 'new' => ['array<string,string>|array<string,false>|array<string,list<mixed>>|false', 'short_options'=>'string', 'long_options='=>'array', '&w_rest_index='=>'int'],
- ],
- 'pg_fetch_all' => [
- 'old' => ['array<array>', 'result'=>'resource'],
- 'new' => ['array<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<string>|false', 'timezoneGroup='=>'int', 'countryCode='=>'string'],
- 'new' => ['list<string>|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 fe0b3b2..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_72_delta.php
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 7.2 to php 7.1 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php 7.1
- * The 'removed' section contains the signatures that were removed in php 7.2.
- * The 'changed' section contains functions for which the signature has changed for php 7.2.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP 7.1 and in PHP 7.2, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- '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<string>'],
- '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<int,string>', '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<int,string>', '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 91002d4..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_73_delta.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 7.3 to php 7.2 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php 7.2
- * The 'removed' section contains the signatures that were removed in php 7.3.
- * The 'changed' section contains functions for which the signature has changed for php 7.3.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP 7.2 and in PHP 7.3, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string,array<string,mixed>>|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 af5e0d9..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_74_delta.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 7.4 to php 7.3 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php 7.3
- * The 'removed' section contains the signatures that were removed in php 7.4.
- * The 'changed' section contains functions for which the signature has changed for php 7.4.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP 7.3 and in PHP 7.4, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- 'ReflectionProperty::getType' => ['?ReflectionType'],
- 'mb_str_split' => ['list<string>|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 afeb1bc..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_80_delta.php
+++ /dev/null
@@ -1,1683 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 8.0 to php 7.4 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php 7.4
- * The 'removed' section contains the signatures that were removed in php 8.0
- * The 'changed' section contains functions for which the signature has changed for php 8.0.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP 7.4 and in PHP 8.0, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- '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<PhpToken>', 'code'=>'string', 'flags='=>'int'],
- 'ReflectionClass::getAttributes' => ['list<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
- 'ReflectionClassConstant::getAttributes' => ['list<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
- 'ReflectionFunctionAbstract::getAttributes' => ['list<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
- 'ReflectionParameter::getAttributes' => ['list<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
- 'ReflectionProperty::getAttributes' => ['list<ReflectionAttribute>', 'name='=>'?string', 'flags='=>'int'],
- 'ReflectionUnionType::getTypes' => ['list<ReflectionNamedType>'],
- '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<string>|false', 'timezoneGroup='=>'int', 'countryCode='=>'string|null'],
- 'new' => ['list<string>', '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<string,mixed>'],
- 'new' => ['array<string,mixed>', 'filter='=>'?int'],
- ],
- 'ReflectionClass::getReflectionConstants' => [
- 'old' => ['list<ReflectionClassConstant>'],
- 'new' => ['list<ReflectionClassConstant>', 'filter='=>'?int'],
- ],
- 'ReflectionClass::newInstanceArgs' => [
- 'old' => ['object', 'args='=>'list<mixed>'],
- 'new' => ['object', 'args='=>'array<array-key, mixed>'],
- ],
- '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<int,int>|false', 'input'=>'string', 'mode='=>'0|1|2'],
- 'new' => ['array<int,int>', '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<string>|false', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'],
- 'new' => ['list<string>', 'separator'=>'string', 'string'=>'string', 'limit='=>'int'],
- ],
- 'get_class_methods' => [
- 'old' => ['list<string>|null', 'object_or_class'=>'mixed'],
- 'new' => ['list<string>', '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<int,int>|false', 'im'=>'resource'],
- 'new' => ['array<int,int>', '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<string>', 'encoding='=>'mixed'],
- 'new' => ['bool|list<string>', '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<string>|false', 'string'=>'string', 'length='=>'positive-int', 'encoding='=>'string'],
- 'new' => ['list<string>', '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<OpenSSLCertificate|string>|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<OpenSSLAsymmetricKey>', '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<string>|false', 'timezoneGroup='=>'int', 'countryCode='=>'?string'],
- 'new' => ['list<string>', '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 b6cae16..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_81_delta.php
+++ /dev/null
@@ -1,1133 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This contains the information needed to convert the function signatures for php 8.1 to php 8.0 (and vice versa)
- *
- * This file has three sections.
- * The 'added' section contains function/method names from FunctionSignatureMap (And alternates, if applicable) that do not exist in php 8.0
- * The 'removed' section contains the signatures that were removed in php 8.1
- * The 'changed' section contains functions for which the signature has changed for php 8.1.
- * Each function in the 'changed' section has an 'old' and a 'new' section,
- * representing the function as it was in PHP 8.0 and in PHP 8.1, respectively
- *
- * @see CallMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- 'added' => [
- '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<ReflectionEnumUnitCase>'],
- '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<array-key, null|scalar|Stringable>', 'separator='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
- 'new' => ['int|false', 'stream'=>'resource', 'fields'=>'array<array-key, null|scalar|Stringable>', '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<mixed>|null'],
- ],
- 'mysqli_stmt_execute' => [
- 'old' => ['bool', 'statement' => 'mysqli_stmt'],
- 'new' => ['bool', 'statement' => 'mysqli_stmt', 'params=' => 'list<mixed>|null'],
- ],
- 'mysqli_stmt::execute' => [
- 'old' => ['bool'],
- 'new' => ['bool', 'params=' => 'list<mixed>|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<array>', 'result' => 'resource', 'result_type=' => 'int'],
- 'new' => ['array<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<string|null>|false', 'result' => 'resource', 'row=' => '?int', 'mode=' => 'int'],
- 'new' => ['array<string|null>|false', 'result' => '\PgSql\Result', 'row=' => '?int', 'mode=' => 'int'],
- ],
- 'pg_fetch_assoc' => [
- 'old' => ['array<string, mixed>|false', 'result' => 'resource', 'row=' => '?int'],
- 'new' => ['array<string, mixed>|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 a5c4875..0000000
--- a/vendor/vimeo/psalm/dictionaries/CallMap_historical.php
+++ /dev/null
@@ -1,16618 +0,0 @@
-<?php // phpcs:ignoreFile
-
-/**
- * This file contains the historic state of PHP functions before version 7.1
- *
- * It is _NOT_ used by the Psalm application itself, but serves as a baseline
- * for testing the validity of the CallMap.php and CallMap_xx_delta.php files
- *
- * Updates to this file are only needed if an old function in the main callmap turns out to be incorrect
- *
- * @see tests\Internal\CallMapTest.php
- *
- * @see FunctionSignatureMap.php
- *
- * @phan-file-suppress PhanPluginMixedKeyNoKey (read by Phan when analyzing this file)
- */
-return [
- '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'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<int,Couchbase\SearchQueryPart>'],
- 'Couchbase\BooleanSearchQuery::mustNot' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array<int,Couchbase\SearchQueryPart>'],
- 'Couchbase\BooleanSearchQuery::should' => ['Couchbase\BooleanSearchQuery', '...queries='=>'array<int,Couchbase\SearchQueryPart>'],
- '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<int,string>'],
- '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<int,Couchbase\SearchQueryPart>'],
- '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<int,Couchbase\SearchQueryPart>'],
- '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<int,string>'],
- '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<int,Couchbase\SearchQueryPart>'],
- '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<int,Couchbase\SearchQueryPart>'],
- 'Couchbase\SearchQuery::docId' => ['Couchbase\DocIdSearchQuery', '...documentIds='=>'array<int,string>'],
- 'Couchbase\SearchQuery::explain' => ['Couchbase\SearchQuery', 'explain'=>'bool'],
- 'Couchbase\SearchQuery::fields' => ['Couchbase\SearchQuery', '...fields='=>'array<int,string>'],
- '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<int,string>'],
- '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<int,string>'],
- '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<int,Couchbase\sort>'],
- '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<int,string>,error_count:int,errors:array<int,string>}'],
- '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<int,string>,error_count:int,errors:array<int,string>}'],
- '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<array{ts: int, time: string, offset: int, isdst: bool, abbr: string}>|false', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
- 'DateTimeZone::listAbbreviations' => ['array<string, list<array{dst: bool, offset: int, timezone_id: string|null}>>|false'],
- 'DateTimeZone::listIdentifiers' => ['list<string>|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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<int>', '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<int, array{mean:float, minima:float, maxima:float, standardDeviation:float, depth:int}>'],
- '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<ImagickPixel>'],
- '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<int|string, string>', '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<string, mixed>', '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<int>'],
- '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<string>', '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<float>'],
- '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<string>'],
- '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<string, float>'],
- '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<array{x:float, y:float}>'],
- '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<array{x:float, y:float}>'],
- 'ImagickDraw::polyline' => ['bool', 'coordinates'=>'list<array{x:float, y:float}>'],
- '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<int|float>'],
- '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<list<float>>', 'origin='=>'array'],
- 'ImagickKernel::getMatrix' => ['list<list<float|false>>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- 'PDOException::getTraceAsString' => ['string'],
- 'PDOStatement::__sleep' => ['list<string>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string, mixed>'],
- 'Postal\Parser::parse_address' => ['array<string,string>', 'address'=>'string', 'options='=>'array<string, 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'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string, string>'],
- '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<string, string>', '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<string, string>'],
- '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<int,string>', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'],
- 'Redis::geoPos' => ['array<int,array{0:string,1:string}>', 'key'=>'string', 'member'=>'string', '...members='=>'string'],
- 'Redis::geoRadius' => ['array<int,mixed>|int', 'key'=>'string', 'longitude'=>'float', 'latitude'=>'float', 'radius'=>'float', 'unit'=>'float', 'options='=>'array<string,mixed>'],
- 'Redis::geoRadiusByMember' => ['array<int,mixed>|int', 'key'=>'string', 'member'=>'string', 'radius'=>'float', 'units'=>'string', 'options='=>'array<string,mixed>'],
- '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<int,string>', '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<int,string>', '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<int,string>|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<int,string>', '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<int,string>', 'key'=>'string', 'member'=>'string', '...other_members='=>'string'],
- 'RedisCluster::geopos' => ['array<int,array{0:string,1:string}>', '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<string>', 'key1'=>'string', 'key2'=>'string', '...other_keys='=>'string'],
- 'RedisCluster::sDiffStore' => ['int', 'dstKey'=>'string', 'key1'=>'string', '...other_keys='=>'string'],
- 'RedisCluster::sInter' => ['list<string>', '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<string>', '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<string>', 'key1'=>'string', '...other_keys='=>'string'],
- 'RedisCluster::sUnion\'1' => ['list<string>', '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<string,mixed>'],
- '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<class-string>'],
- 'ReflectionClass::getInterfaces' => ['array<class-string, ReflectionClass>'],
- 'ReflectionClass::getMethod' => ['ReflectionMethod', 'name'=>'string'],
- 'ReflectionClass::getMethods' => ['list<ReflectionMethod>', 'filter='=>'int'],
- 'ReflectionClass::getModifiers' => ['int'],
- 'ReflectionClass::getName' => ['class-string'],
- 'ReflectionClass::getNamespaceName' => ['string'],
- 'ReflectionClass::getParentClass' => ['ReflectionClass|false'],
- 'ReflectionClass::getProperties' => ['list<ReflectionProperty>', 'filter='=>'int'],
- 'ReflectionClass::getProperty' => ['ReflectionProperty', 'name'=>'string'],
- 'ReflectionClass::getReflectionConstant' => ['ReflectionClassConstant|false', 'name'=>'string'],
- 'ReflectionClass::getReflectionConstants' => ['list<ReflectionClassConstant>'],
- 'ReflectionClass::getShortName' => ['string'],
- 'ReflectionClass::getStartLine' => ['int|false'],
- 'ReflectionClass::getStaticProperties' => ['array<string, ReflectionProperty>'],
- 'ReflectionClass::getStaticPropertyValue' => ['mixed', 'name'=>'string', 'default='=>'mixed'],
- 'ReflectionClass::getTraitAliases' => ['array<string,string>|null'],
- 'ReflectionClass::getTraitNames' => ['list<trait-string>|null'],
- 'ReflectionClass::getTraits' => ['array<trait-string,ReflectionClass>'],
- '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<mixed>'],
- '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<scalar>|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<class-string>'],
- 'ReflectionExtension::getClasses' => ['array<class-string,ReflectionClass>'],
- 'ReflectionExtension::getConstants' => ['array<string,mixed>'],
- 'ReflectionExtension::getDependencies' => ['array<string,string>'],
- 'ReflectionExtension::getFunctions' => ['array<string,ReflectionFunction>'],
- 'ReflectionExtension::getINIEntries' => ['array<string,mixed>'],
- '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<ReflectionParameter>'],
- '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<ReflectionParameter>'],
- '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<string,mixed>'],
- '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<string,\ReflectionClass>'],
- '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<string,string>'],
- 'ReflectionObject::getTraitNames' => ['list<string>'],
- 'ReflectionObject::getTraits' => ['array<string,\ReflectionClass>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string>|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<array-key, null|scalar|Stringable>', '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<string>|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<array-key, null|scalar|Stringable>', 'seperator='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
- 'SplTempFileObject::fread' => ['false|string', 'length'=>'int'],
- 'SplTempFileObject::fscanf' => ['bool', 'format'=>'string', '&...w_vars='=>'array<int,float>|array<int,int>|array<int,string>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string>'],
- '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<string>'],
- '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<string>'],
- '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<string>'],
- '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<string>'],
- '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<string>'],
- '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<string>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<array{file?:string,line?:int,function:string,class?:class-string,type?:\'::\'|\'->\',args?:array<mixed>}>'],
- '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<string,int>', 'values'=>'array<string,mixed>', 'unused='=>'', 'ttl='=>'int'],
- 'apcu_cache_info' => ['array<string,mixed>|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<string>', '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'=>'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<mixed,int>', '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<int,mixed>', '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<mixed,int>|associative-array<mixed,string>', '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<string|int>', '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<int,int>|array<int,string>', '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<int|float|string|null>', 'array'=>'array<int|float|string|null>', 'flags='=>'1'],
- 'array_unique\'2' => ['array<int|float|string|bool|\Stringable|null>', 'array'=>'array<int|float|string|bool|\Stringable|null>', 'flags='=>'2|5'],
- 'array_unshift' => ['int', '&rw_array'=>'array', '...values'=>'mixed'],
- 'array_values' => ['list<mixed>', '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<int,ast\Metadata>'],
- 'ast\get_supported_versions' => ['array<int,int>', '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<mixed>'],
- '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<mixed>'],
- '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<string,string>|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'],
- 'class_parents' => ['array<string, class-string>|false', 'object_or_class'=>'object|string', 'autoload='=>'bool'],
- 'class_uses' => ['array<string,string>|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<string, mixed>', '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<int,int>|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<int,string>,error_count:int,errors:array<int,string>}'],
- '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<array{file:string,line:int,function:string,class?:class-string,object?:object,type?:string,args?: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<array>|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<int,array{lang_tag:string,provider_name:string,provider_desc:string,provider_file:string}>|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<int,string>'],
- '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<string>|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<string>|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<string>|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<string>', '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<mixed>'],
- 'fpassthru' => ['int|false', 'stream'=>'resource'],
- 'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'string|int|float'],
- 'fputcsv' => ['int|false', 'stream'=>'resource', 'fields'=>'array<array-key, null|scalar|Stringable>', '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<mixed>', '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<mixed>'],
- '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<string>|null', 'object_or_class'=>'mixed'],
- 'get_class_vars' => ['array<string,mixed>', 'class'=>'string'],
- 'get_current_user' => ['string'],
- 'get_declared_classes' => ['list<class-string>'],
- 'get_declared_interfaces' => ['list<class-string>'],
- 'get_declared_traits' => ['list<class-string>|null'],
- 'get_defined_constants' => ['array<string,int|string|float|bool|null|array|resource>', 'categorize='=>'bool'],
- 'get_defined_functions' => ['array<string,list<callable-string>>', 'exclude_disabled='=>'bool'],
- 'get_defined_vars' => ['array'],
- 'get_extension_funcs' => ['list<callable-string>|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<string>'],
- 'get_loaded_extensions' => ['list<string>', '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<string,mixed>', 'object'=>'object'],
- 'get_parent_class' => ['class-string|false', 'object_or_class='=>'mixed'],
- 'get_required_files' => ['list<string>'],
- 'get_resource_type' => ['string', 'resource'=>'resource'],
- 'get_resources' => ['array<int,resource>', '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<string>|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<string,string>|array<string,false>|array<string,list<mixed>>|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<string, int>'],
- 'gettimeofday\'1' => ['float', 'as_float='=>'true'],
- 'gettype' => ['string', 'value'=>'mixed'],
- 'glob' => ['list<string>|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<string,GMP>', '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<string>', '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<string>'],
- '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<string>'],
- '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<int,int>|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<int,LibXMLError>'],
- '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<string>', '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<string>|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<string>'],
- '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<string>|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<array<array-key,null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'3'],
- 'mysqli_fetch_all\'1' => ['list<array<string,null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'1'],
- 'mysqli_fetch_all\'2' => ['list<list<null|int|float|string>>', 'result'=>'mysqli_result', 'mode='=>'2'],
- 'mysqli_fetch_array' => ['array<array-key,null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'3'],
- 'mysqli_fetch_array\'1' => ['array<string,null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'1'],
- 'mysqli_fetch_array\'2' => ['list<null|int|float|string>|false|null', 'result'=>'mysqli_result', 'mode='=>'2'],
- 'mysqli_fetch_assoc' => ['array<string,null|int|float|string>|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<null|int|float|string>|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<array<array-key,null|int|float|string>>', 'mode='=>'3'],
- 'mysqli_result::fetch_all\'1' => ['list<array<string,null|int|float|string>>', 'mode='=>'1'],
- 'mysqli_result::fetch_all\'2' => ['list<list<null|int|float|string>>', 'mode='=>'2'],
- 'mysqli_result::fetch_array' => ['array<array-key,null|int|float|string>|false|null', 'mode='=>'3'],
- 'mysqli_result::fetch_array\'1' => ['array<string,null|int|float|string>|false|null', 'mode='=>'1'],
- 'mysqli_result::fetch_array\'2' => ['list<null|int|float|string>|false|null', 'mode='=>'2'],
- 'mysqli_result::fetch_assoc' => ['array<string,null|int|float|string>|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<null|int|float|string>|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<string>'],
- '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<string,mixed>'],
- '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<array>', 'result'=>'resource'],
- 'pg_fetch_all_columns' => ['array', 'result'=>'resource', 'field='=>'int'],
- 'pg_fetch_array' => ['array<string|null>|false', 'result'=>'resource', 'row='=>'?int', 'mode='=>'int'],
- 'pg_fetch_assoc' => ['array<string, mixed>|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<string>}|false', 'group_id'=>'int'],
- 'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list<string>}|false', 'name'=>'string'],
- 'posix_getgroups' => ['list<int>|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<string,callable(array):string>', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
- 'preg_split' => ['list<string>|false', 'pattern'=>'string', 'subject'=>'string', 'limit'=>'int', 'flags='=>'null'],
- 'preg_split\'1' => ['list<string>|list<list<string|int>>|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<string>|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<callable(string):void>'],
- '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<float|int|string|null>|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'=>'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'=>'string', 'length='=>'positive-int'],
- 'str_word_count' => ['array<int, string>|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<string>'],
- 'stream_get_wrappers' => ['list<string>'],
- '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<string, list<array{dst: bool, offset: int, timezone_id: string|null}>>|false'],
- 'timezone_identifiers_list' => ['list<string>|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<array{ts: int, time: string, offset: int, isdst: bool, abbr: string}>|false', 'object'=>'DateTimeZone', 'timestampBegin='=>'int', 'timestampEnd='=>'int'],
- 'timezone_version_get' => ['string'],
- 'tmpfile' => ['resource|false'],
- 'token_get_all' => ['list<string|array{0:int,1:string,2:int}>', '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 3838720..0000000
--- a/vendor/vimeo/psalm/dictionaries/InternalTaintSinkMap.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-use Psalm\Type\TaintKind;
-
-// This maps internal function names to sink types that we don’t want to end up there
-
-/**
- * @var array<string, list<list<TaintKind::*>>>
- */
-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 f769b17..0000000
--- a/vendor/vimeo/psalm/dictionaries/PropertyMap.php
+++ /dev/null
@@ -1,542 +0,0 @@
-<?php
-namespace Psalm\Internal;
-
-/**
- * Stolen from https://github.com/etsy/phan/blob/master/src/Phan/Language/Internal/PropertyMap.php
- *
- * The MIT License (MIT)
- * Copyright (c) 2015 Rasmus Lerdorf
- * Copyright (c) 2015 Andrew Morrison
- *
- * 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.
- */
-
-return [
- 'arrayobject' => [
- '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<DOMAttr>',
- '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<DomNode>',
- '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<int, PhpParser\Node\Expr\ArrayItem|null>',
- ],
- 'phpparser\\node\\expr\\list_' => [
- 'items' => 'array<int, PhpParser\Node\Expr\ArrayItem|null>',
- ],
- 'phpparser\\node\\expr\\arrowfunction' => [
- 'params' => 'list<PhpParser\Node\Param>',
- ],
- 'phpparser\\node\\expr\\closure' => [
- 'params' => 'list<PhpParser\Node\Param>',
- ],
- 'phpparser\\node\\name' => [
- 'parts' => 'non-empty-list<non-empty-string>',
- ],
- 'phpparser\\node\\stmt\\namespace_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\if_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\elseif_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\else_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\for_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\foreach_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\trycatch' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\catch_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\finally_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\case_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\while_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\do_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\class_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\trait_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\stmt\\interface_' => [
- 'stmts' => 'list<PhpParser\Node\Stmt>',
- ],
- 'phpparser\\node\\matcharm' => [
- 'conds' => 'null|non-empty-list<PhpParser\Node\Expr>',
- ],
- 'phpparser\\node\\expr\\shellexec' => [
- 'parts' => 'list<PhpParser\Node>',
- ],
- 'rdkafka\\message' => [
- 'err' => 'int',
- 'topic_name' => 'string',
- 'partition' => 'int',
- 'payload' => 'string',
- 'key' => 'string|null',
- 'offset' => 'int',
- 'timestamp' => 'int',
- 'headers' => 'array<string, string>|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 a633cb8..0000000
--- a/vendor/vimeo/psalm/psalm
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-use Psalm\Internal\Cli\Psalm;
-
-require_once __DIR__ . '/src/Psalm/Internal/Cli/Psalm.php';
-Psalm::run($argv);
diff --git a/vendor/vimeo/psalm/psalm-language-server b/vendor/vimeo/psalm/psalm-language-server
deleted file mode 100755
index a1869f3..0000000
--- a/vendor/vimeo/psalm/psalm-language-server
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-use Psalm\Internal\Cli\LanguageServer;
-
-require_once __DIR__ . '/src/Psalm/Internal/Cli/LanguageServer.php';
-LanguageServer::run($argv);
diff --git a/vendor/vimeo/psalm/psalm-plugin b/vendor/vimeo/psalm/psalm-plugin
deleted file mode 100755
index 6f7d7c5..0000000
--- a/vendor/vimeo/psalm/psalm-plugin
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-use Psalm\Internal\Cli\Plugin;
-
-require_once __DIR__ . '/src/Psalm/Internal/Cli/Plugin.php';
-Plugin::run();
diff --git a/vendor/vimeo/psalm/psalm-refactor b/vendor/vimeo/psalm/psalm-refactor
deleted file mode 100755
index 5bdd7f6..0000000
--- a/vendor/vimeo/psalm/psalm-refactor
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-use Psalm\Internal\Cli\Refactor;
-
-require_once __DIR__ . '/src/Psalm/Internal/Cli/Refactor.php';
-Refactor::run($argv);
diff --git a/vendor/vimeo/psalm/psalter b/vendor/vimeo/psalm/psalter
deleted file mode 100755
index c36c93f..0000000
--- a/vendor/vimeo/psalm/psalter
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-use Psalm\Internal\Cli\Psalter;
-
-require_once __DIR__ . '/src/Psalm/Internal/Cli/Psalter.php';
-Psalter::run($argv);
diff --git a/vendor/vimeo/psalm/src/Psalm/Aliases.php b/vendor/vimeo/psalm/src/Psalm/Aliases.php
deleted file mode 100644
index 1b7dd23..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Aliases.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-namespace Psalm;
-
-class Aliases
-{
- /**
- * @var array<lowercase-string, string>
- */
- public $uses;
-
- /**
- * @var array<lowercase-string, string>
- */
- public $uses_flipped;
-
- /**
- * @var array<lowercase-string, non-empty-string>
- */
- public $functions;
-
- /**
- * @var array<lowercase-string, string>
- */
- public $functions_flipped;
-
- /**
- * @var array<string, string>
- */
- public $constants;
-
- /**
- * @var array<string, string>
- */
- 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<lowercase-string, string> $uses
- * @param array<lowercase-string, non-empty-string> $functions
- * @param array<string, string> $constants
- * @param array<lowercase-string, string> $uses_flipped
- * @param array<lowercase-string, string> $functions_flipped
- * @param array<string, string> $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 82c6bda..0000000
--- a/vendor/vimeo/psalm/src/Psalm/CodeLocation.php
+++ /dev/null
@@ -1,392 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Exception;
-use LogicException;
-use PhpParser;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use UnexpectedValueException;
-
-use function explode;
-use function max;
-use function mb_strcut;
-use function min;
-use function preg_match;
-use function preg_quote;
-use function preg_replace;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function substr_count;
-use function trim;
-
-use const PREG_OFFSET_CAPTURE;
-
-class CodeLocation
-{
- /** @var string */
- public $file_path;
-
- /** @var string */
- public $file_name;
-
- /** @var int */
- public $raw_line_number;
-
- /** @var int */
- private $end_line_number = -1;
-
- /** @var int */
- public $raw_file_start;
-
- /** @var int */
- public $raw_file_end;
-
- /** @var int */
- protected $file_start;
-
- /** @var int */
- protected $file_end;
-
- /** @var bool */
- protected $single_line;
-
- /** @var int */
- protected $preview_start;
-
- /** @var int */
- private $preview_end = -1;
-
- /** @var int */
- private $selection_start = -1;
-
- /** @var int */
- private $selection_end = -1;
-
- /** @var int */
- private $column_from = -1;
-
- /** @var int */
- private $column_to = -1;
-
- /** @var string */
- private $snippet = '';
-
- /** @var null|string */
- private $text;
-
- /** @var int|null */
- public $docblock_start;
-
- /** @var int|null */
- private $docblock_start_line_number;
-
- /** @var int|null */
- private $docblock_line_number;
-
- /** @var null|int */
- private $regex_type;
-
- /** @var bool */
- private $have_recalculated = false;
-
- /** @var null|CodeLocation */
- public $previous_location;
-
- public const VAR_TYPE = 0;
- public const FUNCTION_RETURN_TYPE = 1;
- public const FUNCTION_PARAM_TYPE = 2;
- public const FUNCTION_PHPDOC_RETURN_TYPE = 3;
- public const FUNCTION_PHPDOC_PARAM_TYPE = 4;
- public const FUNCTION_PARAM_VAR = 5;
- public const CATCH_VAR = 6;
- public const FUNCTION_PHPDOC_METHOD = 7;
-
- public function __construct(
- FileSource $file_source,
- PhpParser\Node $stmt,
- ?CodeLocation $previous_location = null,
- bool $single_line = false,
- ?int $regex_type = null,
- ?string $selected_text = null
- ) {
- $this->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 224b740..0000000
--- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/DocblockTypeLocation.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Psalm\CodeLocation;
-
-use Psalm\CodeLocation;
-use Psalm\FileSource;
-
-class DocblockTypeLocation extends CodeLocation
-{
- public function __construct(
- FileSource $file_source,
- int $file_start,
- int $file_end,
- int $line_number
- ) {
- $this->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 eedae0b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/ParseErrorLocation.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-namespace Psalm\CodeLocation;
-
-use PhpParser;
-use Psalm\CodeLocation;
-
-use function substr;
-use function substr_count;
-
-class ParseErrorLocation extends CodeLocation
-{
- public function __construct(
- PhpParser\Error $error,
- string $file_contents,
- string $file_path,
- string $file_name
- ) {
- /** @psalm-suppress PossiblyUndefinedStringArrayOffset */
- $this->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 f75a5d3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/CodeLocation/Raw.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Psalm\CodeLocation;
-
-use Psalm\CodeLocation;
-
-use function substr;
-use function substr_count;
-
-class Raw extends CodeLocation
-{
- public function __construct(
- string $file_contents,
- string $file_path,
- string $file_name,
- int $file_start,
- int $file_end
- ) {
- $this->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 cb72efa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Codebase.php
+++ /dev/null
@@ -1,2013 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Exception;
-use InvalidArgumentException;
-use LanguageServerProtocol\Command;
-use LanguageServerProtocol\CompletionItem;
-use LanguageServerProtocol\CompletionItemKind;
-use LanguageServerProtocol\InsertTextFormat;
-use LanguageServerProtocol\ParameterInformation;
-use LanguageServerProtocol\Position;
-use LanguageServerProtocol\Range;
-use LanguageServerProtocol\SignatureInformation;
-use LanguageServerProtocol\TextEdit;
-use PhpParser;
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\Raw;
-use Psalm\Exception\UnanalyzedFileException;
-use Psalm\Exception\UnpopulatedClasslikeException;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\Analyzer;
-use Psalm\Internal\Codebase\ClassLikes;
-use Psalm\Internal\Codebase\Functions;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\Methods;
-use Psalm\Internal\Codebase\Populator;
-use Psalm\Internal\Codebase\Properties;
-use Psalm\Internal\Codebase\Reflection;
-use Psalm\Internal\Codebase\Scanner;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\Internal\Provider\StatementsProvider;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\TaintKindGroup;
-use Psalm\Type\Union;
-use ReflectionProperty;
-use ReflectionType;
-use UnexpectedValueException;
-
-use function array_combine;
-use function array_merge;
-use function array_pop;
-use function array_reverse;
-use function count;
-use function dirname;
-use function error_log;
-use function explode;
-use function implode;
-use function in_array;
-use function is_numeric;
-use function is_string;
-use function krsort;
-use function ksort;
-use function preg_match;
-use function preg_replace;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function strtolower;
-use function substr;
-use function substr_count;
-
-use const PHP_MAJOR_VERSION;
-use const PHP_MINOR_VERSION;
-use const PHP_VERSION_ID;
-
-class Codebase
-{
- /**
- * @var Config
- */
- public $config;
-
- /**
- * A map of fully-qualified use declarations to the files
- * that reference them (keyed by filename)
- *
- * @var array<lowercase-string, array<int, CodeLocation>>
- */
- 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<string, Union>
- */
- 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<lowercase-string, string>
- */
- public $methods_to_move = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $methods_to_rename = [];
-
- /**
- * @var array<string, string>
- */
- public $properties_to_move = [];
-
- /**
- * @var array<string, string>
- */
- public $properties_to_rename = [];
-
- /**
- * @var array<string, string>
- */
- public $class_constants_to_move = [];
-
- /**
- * @var array<string, string>
- */
- public $class_constants_to_rename = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $classes_to_move = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $call_transforms = [];
-
- /**
- * @var array<string, string>
- */
- public $property_transforms = [];
-
- /**
- * @var array<string, string>
- */
- public $class_constant_transforms = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- 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<string> $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<string, string> $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<PhpParser\Node\Stmt>
- */
- 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<int, CodeLocation>
- */
- 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<int, CodeLocation>
- */
- public function findReferencesToMethod(string $method_id): array
- {
- return $this->file_reference_provider->getClassMethodLocations(strtolower($method_id));
- }
-
- /**
- * @return array<int, CodeLocation>
- */
- 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<int, CodeLocation>
- */
- 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<string, Union>
- */
- 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<string, string> 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<int, FunctionLikeParameter>
- */
- 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<Arg> $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<string, MethodIdentifier>
- */
- 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' => '<?php ' . $storage->getSignature(true),
- 'description' => $storage->description,
- ];
- }
-
- [, $symbol_name] = explode('::', $symbol);
-
- if (strpos($symbol, '$') !== false) {
- $storage = $this->properties->getStorage($symbol);
-
- return [
- 'type' => '<?php ' . $storage->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' => '<?php ' . $const_name,
- 'description' => $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' => '<?php ' . $function_storage->getSignature(true),
- 'description' => $function_storage->description,
- ];
- }
-
- if (!$function_id) {
- return null;
- }
-
- $function = $this->functions->getStorage(null, $function_id);
- return [
- 'type' => '<?php ' . $function->getSignature(true),
- 'description' => $function->description,
- ];
- }
-
- if (strpos($symbol, '$') === 0) {
- $type = VariableFetchAnalyzer::getGlobalType($symbol);
- if (!$type->isMixed()) {
- return ['type' => '<?php ' . $type];
- }
- }
-
- try {
- $storage = $this->classlike_storage_provider->get($symbol);
- return [
- 'type' => '<?php ' . ($storage->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' => '<?php const ' . $symbol . ' ' . $type];
- }
- } else {
- $file_storage = $this->file_storage_provider->get($file_path);
- if (isset($file_storage->constants[$symbol])) {
- return ['type' => '<?php const ' . $symbol . ' ' . $file_storage->constants[$symbol]];
- }
- $constant = ConstFetchAnalyzer::getGlobalConstType($this, $symbol, $symbol);
-
- if ($constant) {
- return ['type' => '<?php const ' . $symbol . ' ' . $constant];
- }
- }
- return null;
- } catch (Exception $e) {
- error_log($e->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<CompletionItem>
- */
- 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<CompletionItem>
- */
- 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<CompletionItem>
- */
- 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<CompletionItem>
- */
- 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<int,string>'))
- * // 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<string, mixed> $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<string> $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<string> $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 d9d81bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config.php
+++ /dev/null
@@ -1,2403 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Composer\Autoload\ClassLoader;
-use Composer\Semver\Constraint\Constraint;
-use Composer\Semver\VersionParser;
-use DOMDocument;
-use DomElement;
-use InvalidArgumentException;
-use LogicException;
-use OutOfBoundsException;
-use Psalm\CodeLocation\Raw;
-use Psalm\Config\IssueHandler;
-use Psalm\Config\ProjectFileFilter;
-use Psalm\Config\TaintAnalysisFileFilter;
-use Psalm\Exception\ConfigException;
-use Psalm\Exception\ConfigNotFoundException;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Composer;
-use Psalm\Internal\EventDispatcher;
-use Psalm\Internal\IncludeCollector;
-use Psalm\Internal\Provider\AddRemoveTaints\HtmlFunctionTainter;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Issue\ArgumentIssue;
-use Psalm\Issue\ClassIssue;
-use Psalm\Issue\CodeIssue;
-use Psalm\Issue\ConfigIssue;
-use Psalm\Issue\FunctionIssue;
-use Psalm\Issue\MethodIssue;
-use Psalm\Issue\PropertyIssue;
-use Psalm\Issue\VariableIssue;
-use Psalm\Plugin\PluginEntryPointInterface;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use SimpleXMLElement;
-use SimpleXMLIterator;
-use Throwable;
-use UnexpectedValueException;
-use Webmozart\PathUtil\Path;
-use XdgBaseDir\Xdg;
-use stdClass;
-
-use function array_map;
-use function array_merge;
-use function array_pad;
-use function array_pop;
-use function array_shift;
-use function assert;
-use function basename;
-use function chdir;
-use function class_exists;
-use function clearstatcache;
-use function count;
-use function dirname;
-use function error_log;
-use function explode;
-use function extension_loaded;
-use function file_exists;
-use function file_get_contents;
-use function filetype;
-use function get_class;
-use function get_defined_constants;
-use function get_defined_functions;
-use function getcwd;
-use function glob;
-use function implode;
-use function in_array;
-use function is_a;
-use function is_dir;
-use function is_file;
-use function is_string;
-use function json_decode;
-use function libxml_clear_errors;
-use function libxml_get_errors;
-use function libxml_use_internal_errors;
-use function mkdir;
-use function phpversion;
-use function preg_match;
-use function preg_quote;
-use function preg_replace;
-use function realpath;
-use function reset;
-use function rmdir;
-use function rtrim;
-use function scandir;
-use function sha1;
-use function simplexml_import_dom;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function strtolower;
-use function substr;
-use function substr_count;
-use function sys_get_temp_dir;
-use function unlink;
-use function version_compare;
-
-use const DIRECTORY_SEPARATOR;
-use const GLOB_NOSORT;
-use const LIBXML_ERR_ERROR;
-use const LIBXML_ERR_FATAL;
-use const LIBXML_NONET;
-use const LIBXML_NOWARNING;
-use const PHP_EOL;
-use const PHP_VERSION_ID;
-use const PSALM_VERSION;
-use const SCANDIR_SORT_NONE;
-
-/**
- * @psalm-suppress PropertyNotSetInConstructor
- * @psalm-consistent-constructor
- */
-class Config
-{
- private const DEFAULT_FILE_NAME = 'psalm.xml';
- public const CONFIG_NAMESPACE = 'https://getpsalm.org/schema/config';
- public const REPORT_INFO = 'info';
- public const REPORT_ERROR = 'error';
- public const REPORT_SUPPRESS = 'suppress';
-
- /**
- * @var array<string>
- */
- 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<int, class-string>
- */
- 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<int, string>
- */
- private $file_extensions = ['php'];
-
- /**
- * @var array<string, class-string<FileScanner>>
- */
- private $filetype_scanners = [];
-
- /**
- * @var array<string, class-string<FileAnalyzer>>
- */
- private $filetype_analyzers = [];
-
- /**
- * @var array<string, string>
- */
- private $filetype_scanner_paths = [];
-
- /**
- * @var array<string, string>
- */
- private $filetype_analyzer_paths = [];
-
- /**
- * @var array<string, IssueHandler>
- */
- private $issue_handlers = [];
-
- /**
- * @var array<int, string>
- */
- private $mock_classes = [];
-
- /**
- * @var array<string, string>
- */
- private $preloaded_stub_files = [];
-
- /**
- * @var array<string, string>
- */
- 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<string, bool>
- */
- public $ignored_exceptions = [];
-
- /**
- * @var array<string, bool>
- */
- public $ignored_exceptions_in_global_scope = [];
-
- /**
- * @var array<string, bool>
- */
- public $ignored_exceptions_and_descendants = [];
-
- /**
- * @var array<string, bool>
- */
- 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<lowercase-string, bool>
- */
- 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<array{class:string,config:?SimpleXMLElement}>
- */
- private $plugin_classes = [];
-
- /**
- * @var bool
- */
- public $allow_internal_named_arg_calls = true;
-
- /**
- * @var bool
- */
- public $allow_named_arg_calls = true;
-
- /** @var array<string, mixed> */
- private $predefined_constants = [];
-
- /** @var array<callable-string, bool> */
- private $predefined_functions = [];
-
- /** @var ClassLoader|null */
- private $composer_class_loader;
-
- /**
- * Custom functions that always exit
- *
- * @var array<lowercase-string, bool>
- */
- 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<string, string>
- */
- 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<ConfigIssue> */
- 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<array{class:string, config:?SimpleXMLElement}> */
- 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<T>
- */
- 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<T>
- */
- 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<string>
- */
- public function getProjectDirectories(): array
- {
- if (!$this->project_files) {
- return [];
- }
-
- return $this->project_files->getDirectories();
- }
-
- /**
- * @return array<string>
- */
- public function getProjectFiles(): array
- {
- if (!$this->project_files) {
- return [];
- }
-
- return $this->project_files->getFiles();
- }
-
- /**
- * @return array<string>
- */
- 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<int, string>
- */
- public function getFileExtensions(): array
- {
- return $this->file_extensions;
- }
-
- /**
- * @return array<string, class-string<FileScanner>>
- */
- public function getFiletypeScanners(): array
- {
- return $this->filetype_scanners;
- }
-
- /**
- * @return array<string, class-string<FileAnalyzer>>
- */
- public function getFiletypeAnalyzers(): array
- {
- return $this->filetype_analyzers;
- }
-
- /**
- * @return array<int, string>
- */
- 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<string, mixed>
- */
- public function getPredefinedConstants(): array
- {
- return $this->predefined_constants;
- }
-
- public function collectPredefinedConstants(): void
- {
- $this->predefined_constants = get_defined_constants();
- }
-
- /**
- * @return array<callable-string, bool>
- */
- 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<string, string>
- */
- 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<int, lowercase-string>
- */
- 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 f67eb5c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/Creator.php
+++ /dev/null
@@ -1,296 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-use Psalm\Config;
-use Psalm\Exception\ConfigCreationException;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Composer;
-
-use function array_filter;
-use function array_keys;
-use function array_merge;
-use function array_shift;
-use function array_sum;
-use function array_unique;
-use function array_values;
-use function count;
-use function explode;
-use function file_exists;
-use function file_get_contents;
-use function glob;
-use function implode;
-use function is_array;
-use function is_dir;
-use function json_decode;
-use function ksort;
-use function max;
-use function preg_replace;
-use function sort;
-use function str_replace;
-use function strpos;
-
-use const DIRECTORY_SEPARATOR;
-use const GLOB_NOSORT;
-
-class Creator
-{
- private const TEMPLATE = '<?xml version="1.0"?>
-<psalm
- errorLevel="1"
- resolveFromConfigFile="true"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="https://getpsalm.org/schema/config"
- xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
->
- <projectFiles>
- <directory name="src" />
- <ignoreFiles>
- <directory name="vendor" />
- </ignoreFiles>
- </projectFiles>
-</psalm>
-';
-
- /**
- * @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(
- '<directory name="src" />',
- implode("\n ", $paths),
- self::TEMPLATE
- );
-
- if (is_dir($current_dir . DIRECTORY_SEPARATOR . $vendor_dir)) {
- $template = str_replace(
- '<directory name="vendor" />',
- '<directory name="' . $vendor_dir . '" />',
- $template
- );
- } else {
- $template = str_replace(
- '<directory name="vendor" />',
- '',
- $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<IssueData> $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<string>
- */
- 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[] = '<directory name="' . $suggested_dir . '" />';
- } 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[] = '<directory name="src" />';
- } 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<string>
- * @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[] = '<directory name="' . $path . '" />';
- }
- }
- }
-
- $nodes = array_unique($nodes);
-
- sort($nodes);
-
- return $nodes;
- }
-
- /**
- * @return list<string>
- */
- 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[] = '<file name="' . $php_file . '" />';
- } else {
- $nodes[] = '<directory name="' . $parts[0] . '" />';
- }
- }
-
- 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 7d226a2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/ErrorLevelFileFilter.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-use Psalm\Config;
-use Psalm\Exception\ConfigException;
-use SimpleXMLElement;
-
-use function in_array;
-
-class ErrorLevelFileFilter extends FileFilter
-{
- /**
- * @var string
- */
- private $error_level = '';
-
- /**
- * @return static
- */
- public static function loadFromArray(
- array $config,
- string $base_dir,
- bool $inclusive
- ): ErrorLevelFileFilter {
- $filter = parent::loadFromArray($config, $base_dir, $inclusive);
-
- if (isset($config['type'])) {
- $filter->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('<type> 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('<type> 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 76f53d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/FileFilter.php
+++ /dev/null
@@ -1,559 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-use Psalm\Exception\ConfigException;
-use RecursiveDirectoryIterator;
-use RecursiveIteratorIterator;
-use SimpleXMLElement;
-
-use function array_filter;
-use function array_map;
-use function explode;
-use function glob;
-use function in_array;
-use function is_dir;
-use function is_iterable;
-use function preg_match;
-use function preg_replace;
-use function readlink;
-use function realpath;
-use function restore_error_handler;
-use function set_error_handler;
-use function str_replace;
-use function stripos;
-use function strpos;
-use function strtolower;
-
-use const DIRECTORY_SEPARATOR;
-use const E_WARNING;
-use const GLOB_NOSORT;
-use const GLOB_ONLYDIR;
-
-/**
- * @psalm-consistent-constructor
- */
-class FileFilter
-{
- /**
- * @var array<string>
- */
- protected $directories = [];
-
- /**
- * @var array<string>
- */
- protected $files = [];
-
- /**
- * @var array<string>
- */
- protected $fq_classlike_names = [];
-
- /**
- * @var array<string>
- */
- protected $fq_classlike_patterns = [];
-
- /**
- * @var array<string>
- */
- protected $method_ids = [];
-
- /**
- * @var array<string>
- */
- protected $property_ids = [];
-
- /**
- * @var array<string>
- */
- protected $var_names = [];
-
- /**
- * @var array<string>
- */
- protected $files_lowercase = [];
-
- /**
- * @var bool
- */
- protected $inclusive;
-
- /**
- * @var array<string, bool>
- */
- protected $ignore_type_stats = [];
-
- /**
- * @var array<string, bool>
- */
- 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<string>
- */
- public function getDirectories(): array
- {
- return $this->directories;
- }
-
- /**
- * @return array<string>
- */
- 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 cdc2c28..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/IssueHandler.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-use Psalm\Config;
-use Psalm\Exception\ConfigException;
-use SimpleXMLElement;
-
-use function array_filter;
-use function array_map;
-use function dirname;
-use function in_array;
-use function scandir;
-use function strtolower;
-use function substr;
-
-use const SCANDIR_SORT_NONE;
-
-class IssueHandler
-{
- /**
- * @var string
- */
- private $error_level = Config::REPORT_ERROR;
-
- /**
- * @var array<ErrorLevelFileFilter>
- */
- 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<int, string>
- */
- 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 9afa3d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/ProjectFileFilter.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-use Psalm\Exception\ConfigException;
-use SimpleXMLElement;
-
-use function stripos;
-use function strpos;
-
-class ProjectFileFilter extends FileFilter
-{
- /**
- * @var ProjectFileFilter|null
- */
- private $file_filter;
-
- /**
- * @return static
- */
- public static function loadFromXMLElement(
- SimpleXMLElement $e,
- string $base_dir,
- bool $inclusive
- ): ProjectFileFilter {
- $filter = parent::loadFromXMLElement($e, $base_dir, $inclusive);
-
- if (isset($e->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 61a9d0f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Config/TaintAnalysisFileFilter.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Config;
-
-class TaintAnalysisFileFilter extends FileFilter
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Context.php b/vendor/vimeo/psalm/src/Psalm/Context.php
deleted file mode 100644
index 73e642a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Context.php
+++ /dev/null
@@ -1,855 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\ReferenceConstraint;
-use Psalm\Internal\Scope\CaseScope;
-use Psalm\Internal\Scope\FinallyScope;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\Internal\Type\AssertionReconciler;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Type\Atomic\DependentType;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_search;
-use function count;
-use function in_array;
-use function is_int;
-use function json_encode;
-use function preg_match;
-use function preg_quote;
-use function preg_replace;
-use function strpos;
-use function strtolower;
-
-class Context
-{
- /**
- * @var array<string, Union>
- */
- public $vars_in_scope = [];
-
- /**
- * @var array<string, bool>
- */
- 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<lowercase-string,true>
- */
- public $phantom_classes = [];
-
- /**
- * A list of files checked with file_exists
- *
- * @var array<string,bool>
- */
- public $phantom_files = [];
-
- /**
- * A list of clauses in Conjunctive Normal Form
- *
- * @var list<Clause>
- */
- public $clauses = [];
-
- /**
- * A list of hashed clauses that have already been factored in
- *
- * @var list<string|int>
- */
- 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<string, bool>|null
- */
- public $initialized_methods;
-
- /**
- * @var array<string, Union>
- */
- public $constants = [];
-
- /**
- * Whether or not to track exceptions
- *
- * @var bool
- */
- public $collect_exceptions = false;
-
- /**
- * A list of variables that have been referenced
- *
- * @var array<string, bool>
- */
- public $referenced_var_ids = [];
-
- /**
- * A list of variables that have been passed by reference (where we know their type)
- *
- * @var array<string, ReferenceConstraint>
- */
- 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<string, int>
- */
- public $assigned_var_ids = [];
-
- /**
- * A list of vars that have been may have been assigned to
- *
- * @var array<string, bool>
- */
- public $possibly_assigned_var_ids = [];
-
- /**
- * A list of classes or interfaces that may have been thrown
- *
- * @var array<string, array<array-key, CodeLocation>>
- */
- public $possibly_thrown_exceptions = [];
-
- /**
- * @var bool
- */
- public $is_global = false;
-
- /**
- * @var array<string, bool>
- */
- 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<string, bool>
- */
- 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<string, bool> $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<string, Union> $new_vars_in_scope
- *
- * @return array<string, Union>
- */
- 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<string>
- */
- 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<string, bool> $changed_var_ids
- *
- * @return array{list<Clause>, list<Clause>}
- *
- * @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<Clause>
- */
- 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 ae3cd6c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/DocComment.php
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use PhpParser\Comment\Doc;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Internal\Scanner\DocblockParser;
-use Psalm\Internal\Scanner\ParsedDocblock;
-
-use function array_filter;
-use function explode;
-use function implode;
-use function in_array;
-use function min;
-use function preg_match;
-use function preg_match_all;
-use function preg_replace;
-use function rtrim;
-use function str_repeat;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strspn;
-use function substr;
-use function trim;
-
-use const PREG_SET_ORDER;
-
-class DocComment
-{
- public const PSALM_ANNOTATIONS = [
- 'return', 'param', 'template', 'var', 'type',
- 'template-covariant', 'property', 'property-read', 'property-write', 'method',
- 'assert', 'assert-if-true', 'assert-if-false', 'suppress',
- 'ignore-nullable-return', 'override-property-visibility',
- 'override-method-visibility', 'seal-properties', 'seal-methods',
- 'generator-return', 'ignore-falsable-return', 'variadic', 'pure',
- 'ignore-variable-method', 'ignore-variable-property', 'internal',
- 'taint-sink', 'taint-source', 'assert-untainted', 'scope-this',
- 'mutation-free', 'external-mutation-free', 'immutable', 'readonly',
- 'allow-private-mutation', 'readonly-allow-private-mutation',
- 'yield', 'trace', 'import-type', 'flow', 'taint-specialize', 'taint-escape',
- 'taint-unescape', 'self-out', 'consistent-constructor', 'stub-override',
- 'require-extends', 'require-implements', 'param-out', 'ignore-var',
- 'consistent-templates', 'if-this-is', 'this-out'
- ];
-
- /**
- * Parse a docblock comment into its parts.
- *
- * Taken from advanced api docmaker, which was taken from
- * https://github.com/facebook/libphutil/blob/master/src/parser/docblock/PhutilDocblockParser.php
- *
- * @return array Array of the main comment and specials
- *
- * @psalm-return array{description:string, specials:array<string, array<int, string>>}
- * @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<int,string>
- */
- public static function parseSuppressList(string $suppress_entry): array
- {
- preg_match(
- '/
- (?(DEFINE)
- # either a single issue or comma separated list of issues
- (?<issue_list> (?&issue) \s* , \s* (?&issue_list) | (?&issue) )
-
- # definition of a single issue
- (?<issue> [A-Za-z0-9_-]+ )
- )
- ^ (?P<issues> (?&issue_list) ) (?P<description> .* ) $
- /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 9759ab9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/ErrorBaseline.php
+++ /dev/null
@@ -1,331 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use DOMDocument;
-use DOMElement;
-use Psalm\Exception\ConfigException;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Provider\FileProvider;
-use RuntimeException;
-
-use function array_filter;
-use function array_intersect;
-use function array_map;
-use function array_merge;
-use function array_reduce;
-use function array_values;
-use function get_loaded_extensions;
-use function implode;
-use function ksort;
-use function min;
-use function phpversion;
-use function preg_replace_callback;
-use function sort;
-use function str_replace;
-use function strpos;
-use function trim;
-use function usort;
-
-use const LIBXML_NOBLANKS;
-use const PHP_VERSION;
-
-class ErrorBaseline
-{
- /**
- * @param array<string,array<string,array{o:int, s:array<int, string>}>> $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<int, string>} $existingIssue
- */
- function (int $carry, array $existingIssue): int {
- return $carry + $existingIssue['o'];
- },
- 0
- );
- }
-
- return $totalIssues;
- }
-
- /**
- * @param array<string, list<IssueData>> $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<string,array<string,array{o:int, s: list<string>}>>
- *
- * @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>');
- }
-
- $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<string, list<IssueData>> $issues
- *
- * @return array<string, array<string, array{o: int, s: list<string>}>>
- *
- * @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<string, list<IssueData>> $issues
- *
- * @return array<string,array<string,array{o:int, s:array<int, string>}>>
- */
- private static function countIssueTypesByFile(array $issues): array
- {
- if ($issues === []) {
- return [];
- }
- $groupedIssues = array_reduce(
- array_merge(...array_values($issues)),
- /**
- * @param array<string,array<string,array{o:int, s:array<int, string>}>> $carry
- *
- * @return array<string,array<string,array{o:int, s:array<int, string>}>>
- */
- 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<string,array<string,array{o:int, s:array<int, string>}>> $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(
- '/<files (psalm-version="[^"]+") (?:php-version="(.+)"(\/?>)\n)/',
- /**
- * @param string[] $matches
- */
- function (array $matches): string {
- return
- '<files' .
- "\n " .
- $matches[1] .
- "\n" .
- ' php-version="' .
- "\n " .
- str_replace('&#10;&#9;', "\n ", $matches[2]).
- "\n" .
- ' "' .
- "\n" .
- $matches[3] .
- "\n";
- },
- $baselineDoc->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 2056b1a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/CircularReferenceException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class CircularReferenceException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php b/vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php
deleted file mode 100644
index a10e143..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/CodeException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class CodeException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php b/vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php
deleted file mode 100644
index 2687f61..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/ComplicatedExpressionException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class ComplicatedExpressionException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php b/vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php
deleted file mode 100644
index 814ddf3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigCreationException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class ConfigCreationException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php b/vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php
deleted file mode 100644
index 035e682..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class ConfigException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php b/vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php
deleted file mode 100644
index 10f9939..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/ConfigNotFoundException.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-class ConfigNotFoundException extends ConfigException
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php b/vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php
deleted file mode 100644
index 6039847..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/DocblockParseException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class DocblockParseException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php b/vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php
deleted file mode 100644
index a24296b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/FileIncludeException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class FileIncludeException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php b/vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php
deleted file mode 100644
index dc878a5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/IncorrectDocblockException.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-class IncorrectDocblockException extends DocblockParseException
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php b/vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php
deleted file mode 100644
index 4218136..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/InvalidClasslikeOverrideException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class InvalidClasslikeOverrideException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php b/vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php
deleted file mode 100644
index 807c06c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/InvalidMethodOverrideException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class InvalidMethodOverrideException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php b/vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php
deleted file mode 100644
index 53e4753..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/RefactorException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class RefactorException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php b/vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php
deleted file mode 100644
index 87b6184..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/ScopeAnalysisException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class ScopeAnalysisException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php b/vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php
deleted file mode 100644
index f17cc2c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/TypeParseTreeException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class TypeParseTreeException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php b/vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php
deleted file mode 100644
index df8024c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/UnanalyzedFileException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class UnanalyzedFileException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php b/vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php
deleted file mode 100644
index a44ecfa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/UnpopulatedClasslikeException.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use LogicException;
-
-class UnpopulatedClasslikeException extends LogicException
-{
- public function __construct(string $fq_classlike_name)
- {
- parent::__construct(
- 'Cannot check inheritance - \'' . $fq_classlike_name . '\' has not been populated yet.'
- . ' You may need to defer this check to a later phase.'
- );
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php b/vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php
deleted file mode 100644
index ef62d35..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/UnpreparedAnalysisException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class UnpreparedAnalysisException extends Exception
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php b/vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php
deleted file mode 100644
index be1021c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Exception/UnsupportedIssueToFixException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Exception;
-
-use Exception;
-
-class UnsupportedIssueToFixException extends Exception
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php b/vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php
deleted file mode 100644
index 0f6ed2f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/FileBasedPluginAdapter.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Plugin\PluginEntryPointInterface;
-use Psalm\Plugin\RegistrationInterface;
-use SimpleXMLElement;
-use UnexpectedValueException;
-
-use function assert;
-use function class_exists;
-use function reset;
-use function str_replace;
-
-use const DIRECTORY_SEPARATOR;
-
-class FileBasedPluginAdapter implements PluginEntryPointInterface
-{
- /** @var string */
- private $path;
-
- /** @var Codebase */
- private $codebase;
-
- /** @var Config */
- private $config;
-
- public function __construct(string $path, Config $config, Codebase $codebase)
- {
- if (!$path) {
- throw new UnexpectedValueException('$path cannot be empty');
- }
-
- $this->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 d9e7884..0000000
--- a/vendor/vimeo/psalm/src/Psalm/FileManipulation.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use function sha1;
-use function strlen;
-use function strrpos;
-use function substr;
-use function trim;
-
-class FileManipulation
-{
- /** @var int */
- public $start;
-
- /** @var int */
- public $end;
-
- /** @var string */
- public $insertion_text;
-
- /** @var bool */
- public $preserve_indentation;
-
- /** @var bool */
- public $remove_trailing_newline;
-
- public function __construct(
- int $start,
- int $end,
- string $insertion_text,
- bool $preserve_indentation = false,
- bool $remove_trailing_newline = false
- ) {
- $this->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 9d1c5ff..0000000
--- a/vendor/vimeo/psalm/src/Psalm/FileSource.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm;
-
-interface FileSource
-{
- public function getFileName(): string;
-
- public function getFilePath(): string;
-
- public function getRootFileName(): string;
-
- public function getRootFilePath(): string;
-
- public function getAliases(): Aliases;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php b/vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php
deleted file mode 100644
index 7b59a0a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra.php
+++ /dev/null
@@ -1,630 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Psalm\Exception\ComplicatedExpressionException;
-use UnexpectedValueException;
-
-use function array_diff_key;
-use function array_filter;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_pop;
-use function array_unique;
-use function array_values;
-use function count;
-use function in_array;
-use function mt_rand;
-use function substr;
-
-class Algebra
-{
- /**
- * @param array<string, non-empty-list<non-empty-list<string>>> $all_types
- *
- * @return array<string, non-empty-list<non-empty-list<string>>>
- *
- * @psalm-pure
- */
- public static function negateTypes(array $all_types): array
- {
- return array_filter(
- array_map(
- /**
- * @param non-empty-list<non-empty-list<string>> $anded_types
- *
- * @return list<non-empty-list<string>>
- */
- 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<Clause> $clauses
- *
- * @return list<Clause>
- *
- * @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<Clause> $clauses
- * @param array<string, bool> $cond_referenced_var_ids
- * @param array<string, array<int, array<int, string>>> $active_truths
- *
- * @return array<string, list<array<int, string>>>
- */
- 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<int, string> $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<Clause> $clauses
- *
- * @return list<Clause>
- *
- * @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<Clause> $left_clauses
- * @param list<Clause> $right_clauses
- *
- * @return list<Clause>
- *
- * @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<string, non-empty-list<string>> */
- $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<Clause> $clauses
- *
- * @return non-empty-list<Clause>
- */
- 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 b6504af..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Algebra/FormulaGenerator.php
+++ /dev/null
@@ -1,457 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Algebra;
-
-use PhpParser;
-use Psalm\Codebase;
-use Psalm\FileSource;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Analyzer\Statements\Expression\AssertionFinder;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Node\Expr\BinaryOp\VirtualBooleanAnd;
-use Psalm\Node\Expr\BinaryOp\VirtualBooleanOr;
-use Psalm\Node\Expr\VirtualBooleanNot;
-
-use function array_merge;
-use function count;
-use function spl_object_id;
-use function strlen;
-use function substr;
-
-class FormulaGenerator
-{
- /**
- * @return list<Clause>
- */
- 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 a7f2a54..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Clause;
-use Psalm\Issue\ParadoxicalCondition;
-use Psalm\Issue\RedundantCondition;
-use Psalm\IssueBuffer;
-
-use function array_intersect_key;
-use function array_unique;
-use function count;
-use function implode;
-use function preg_match;
-
-/**
- * @internal
- */
-class AlgebraAnalyzer
-{
- /**
- * This looks to see if there are any clauses in one formula that contradict
- * clauses in another formula, or clauses that duplicate previous clauses
- *
- * e.g.
- * if ($a) { }
- * elseif ($a) { }
- *
- * @param list<Clause> $formula_1
- * @param list<Clause> $formula_2
- * @param array<string, int> $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 3ce5ca4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php
+++ /dev/null
@@ -1,394 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use Generator;
-use PhpParser\Node\Arg;
-use PhpParser\Node\Attribute;
-use PhpParser\Node\AttributeGroup;
-use PhpParser\Node\Expr\New_;
-use PhpParser\Node\Name\FullyQualified;
-use PhpParser\Node\Stmt\Expression;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\ConstantTypeResolver;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use Psalm\Issue\InvalidAttribute;
-use Psalm\Issue\UndefinedClass;
-use Psalm\IssueBuffer;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\HasAttributesInterface;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Union;
-
-use function array_shift;
-use function array_values;
-use function assert;
-use function count;
-use function reset;
-use function strtolower;
-
-class AttributesAnalyzer
-{
- private const TARGET_DESCRIPTIONS = [
- 1 => '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<array-key, AttributeGroup> $attribute_groups
- * @param key-of<self::TARGET_DESCRIPTIONS> $target
- * @param array<array-key, string> $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<array-key, string> $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<array-key, string> $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<AttributeGroup> $attribute_groups
- *
- * @return Generator<int, Attribute>
- */
- 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<Arg> $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 8f2ca0e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CanAlias.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\FileManipulation;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-
-use function implode;
-use function strtolower;
-
-trait CanAlias
-{
- /**
- * @var array<lowercase-string, string>
- */
- private $aliased_classes = [];
-
- /**
- * @var array<lowercase-string, CodeLocation>
- */
- private $aliased_class_locations = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- private $aliased_classes_flipped = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- private $aliased_classes_flipped_replaceable = [];
-
- /**
- * @var array<lowercase-string, non-empty-string>
- */
- private $aliased_functions = [];
-
- /**
- * @var array<string, string>
- */
- 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<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array
- {
- return $this->aliased_classes_flipped;
- }
-
- /**
- * @return array<string, string>
- */
- 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 cb4e634..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php
+++ /dev/null
@@ -1,2638 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use Exception;
-use InvalidArgumentException;
-use LogicException;
-use PhpParser;
-use PhpParser\Node\Stmt\Class_;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\FunctionLike\ReturnTypeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\AtomicPropertyFetchAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\FileManipulation\PropertyDocblockManipulator;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DeprecatedClass;
-use Psalm\Issue\DeprecatedInterface;
-use Psalm\Issue\DeprecatedTrait;
-use Psalm\Issue\DuplicateEnumCaseValue;
-use Psalm\Issue\ExtensionRequirementViolation;
-use Psalm\Issue\ImplementationRequirementViolation;
-use Psalm\Issue\InaccessibleMethod;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InvalidEnumCaseValue;
-use Psalm\Issue\InvalidExtendClass;
-use Psalm\Issue\InvalidTemplateParam;
-use Psalm\Issue\InvalidTraversableImplementation;
-use Psalm\Issue\MethodSignatureMismatch;
-use Psalm\Issue\MismatchingDocblockPropertyType;
-use Psalm\Issue\MissingConstructor;
-use Psalm\Issue\MissingImmutableAnnotation;
-use Psalm\Issue\MissingPropertyType;
-use Psalm\Issue\MissingTemplateParam;
-use Psalm\Issue\MutableDependency;
-use Psalm\Issue\NoEnumProperties;
-use Psalm\Issue\NonInvariantDocblockPropertyType;
-use Psalm\Issue\NonInvariantPropertyType;
-use Psalm\Issue\OverriddenPropertyAccess;
-use Psalm\Issue\ParseError;
-use Psalm\Issue\PropertyNotSetInConstructor;
-use Psalm\Issue\ReservedWord;
-use Psalm\Issue\TooManyTemplateParams;
-use Psalm\Issue\UndefinedClass;
-use Psalm\Issue\UndefinedInterface;
-use Psalm\Issue\UndefinedTrait;
-use Psalm\Issue\UnimplementedAbstractMethod;
-use Psalm\Issue\UnimplementedInterfaceMethod;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualStaticCall;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\Stmt\VirtualClassMethod;
-use Psalm\Node\Stmt\VirtualExpression;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeAnalysisEvent;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_pop;
-use function array_search;
-use function array_values;
-use function assert;
-use function count;
-use function explode;
-use function implode;
-use function in_array;
-use function is_int;
-use function is_string;
-use function preg_match;
-use function preg_replace;
-use function reset;
-use function str_replace;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class ClassAnalyzer extends ClassLikeAnalyzer
-{
- /**
- * @var array<string, Union>
- */
- 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<int, TTemplateParam|TNamedObject> $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()
- : '<empty>'
- )
- . ", not invariant with " . $guide_class_name . '::$'
- . $property_name . ' of type '
- . ($guide_property_storage->signature_type
- ? $guide_property_storage->signature_type->getId()
- : '<empty>'
- ),
- $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(
- ['<array-key, mixed>', '<empty, empty>'],
- '',
- (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 0b4934e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php
+++ /dev/null
@@ -1,648 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Issue\InaccessibleProperty;
-use Psalm\Issue\InvalidClass;
-use Psalm\Issue\MissingDependency;
-use Psalm\Issue\ReservedWord;
-use Psalm\Issue\UndefinedAttributeClass;
-use Psalm\Issue\UndefinedClass;
-use Psalm\Issue\UndefinedDocblockClass;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeExistenceCheckEvent;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_pop;
-use function explode;
-use function gettype;
-use function implode;
-use function in_array;
-use function preg_match;
-use function preg_replace;
-use function strtolower;
-
-/**
- * @internal
- */
-abstract class ClassLikeAnalyzer extends SourceAnalyzer
-{
- public const VISIBILITY_PUBLIC = 1;
- public const VISIBILITY_PROTECTED = 2;
- public const VISIBILITY_PRIVATE = 3;
-
- public const SPECIAL_TYPES = [
- 'int' => '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<string> $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 <empty string> 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<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array
- {
- if ($this->source instanceof NamespaceAnalyzer || $this->source instanceof FileAnalyzer) {
- return $this->source->getAliasedClassesFlipped();
- }
-
- return [];
- }
-
- /**
- * @return array<string, string>
- */
- 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<string, array<string, Union>>|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<string, string>
- */
- 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 dff5056..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-class ClassLikeNameOptions
-{
- /** @var bool */
- public $inferred;
-
- /** @var bool */
- public $allow_trait;
-
- /** @var bool */
- public $allow_interface;
-
- /** @var bool */
- public $allow_enum;
-
- /** @var bool */
- public $from_docblock;
-
- /** @var bool */
- public $from_attribute;
-
- public function __construct(
- bool $inferred = false,
- bool $allow_trait = false,
- bool $allow_interface = true,
- bool $allow_enum = true,
- bool $from_docblock = false,
- bool $from_attribute = false
- ) {
- $this->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 1b36c9b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php
+++ /dev/null
@@ -1,343 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\PhpVisitor\ShortClosureVisitor;
-use Psalm\Issue\DuplicateParam;
-use Psalm\Issue\PossiblyUndefinedVariable;
-use Psalm\Issue\UndefinedVariable;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function array_map;
-use function in_array;
-use function is_string;
-use function preg_match;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- * @extends FunctionLikeAnalyzer<PhpParser\Node\Expr\Closure|PhpParser\Node\Expr\ArrowFunction>
- */
-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 5af3a43..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/CommentAnalyzer.php
+++ /dev/null
@@ -1,391 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\FileSource;
-use Psalm\Internal\Scanner\DocblockParser;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Internal\Scanner\VarDocblockComment;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function rtrim;
-use function str_replace;
-use function strlen;
-use function substr;
-use function substr_count;
-use function trim;
-
-/**
- * @internal
- */
-class CommentAnalyzer
-{
- public const TYPE_REGEX = '(\??\\\?[\(\)A-Za-z0-9_&\<\.=,\>\[\]\-\{\}:|?\\\\]*|\$[a-zA-Z_0-9_]+)';
-
- /**
- * @param array<string, array<string, Union>>|null $template_type_map
- * @param array<string, TypeAlias> $type_aliases
- *
- * @throws DocblockParseException if there was a problem parsing the docblock
- *
- * @return list<VarDocblockComment>
- */
- 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<string, array<string, Union>>|null $template_type_map
- * @param array<string, TypeAlias> $type_aliases
- *
- * @return list<VarDocblockComment>
- *
- * @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<string>
- *
- * @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 a33ac96..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/DataFlowNodeData.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-/**
- * @psalm-immutable
- */
-class DataFlowNodeData
-{
- /**
- * @var int
- */
- public $line_from;
-
- /**
- * @var int
- */
- public $line_to;
-
- /**
- * @var string
- */
- public $label;
-
- /**
- * @var string
- */
- public $file_name;
-
- /**
- * @var string
- */
- public $file_path;
-
- /**
- * @var string
- */
- public $snippet;
-
- /**
- * @var int
- */
- public $from;
-
- /**
- * @var int
- */
- public $to;
-
- /**
- * @var int
- */
- public $snippet_from;
-
- /**
- * @var int
- */
- public $column_from;
-
- /**
- * @var int
- */
- public $column_to;
-
- public function __construct(
- string $label,
- int $line_from,
- int $line_to,
- string $file_name,
- string $file_path,
- string $snippet,
- int $from,
- int $to,
- int $snippet_from,
- int $column_from,
- int $column_to
- ) {
- $this->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 0d57d4c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php
+++ /dev/null
@@ -1,682 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\UnpreparedAnalysisException;
-use Psalm\Internal\Codebase\Functions;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\Reflection;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\TypeAlias\LinkableTypeAlias;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Issue\InvalidTypeImport;
-use Psalm\Issue\UncaughtThrowInGlobalScope;
-use Psalm\IssueBuffer;
-use Psalm\NodeTypeProvider;
-use Psalm\Plugin\EventHandler\Event\AfterFileAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\BeforeFileAnalysisEvent;
-use Psalm\Type;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_combine;
-use function array_diff_key;
-use function array_keys;
-use function count;
-use function implode;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- * @psalm-consistent-constructor
- */
-class FileAnalyzer extends SourceAnalyzer
-{
- use CanAlias;
-
- /**
- * @var string
- */
- protected $file_name;
-
- /**
- * @var string
- */
- protected $file_path;
-
- /**
- * @var string|null
- */
- protected $root_file_path;
-
- /**
- * @var string|null
- */
- protected $root_file_name;
-
- /**
- * @var array<string, bool>
- */
- private $required_file_paths = [];
-
- /**
- * @var array<string, bool>
- */
- private $parent_file_paths = [];
-
- /**
- * @var array<string>
- */
- private $suppressed_issues = [];
-
- /**
- * @var array<string, array<string, string>>
- */
- private $namespace_aliased_classes = [];
-
- /**
- * @var array<string, array<lowercase-string, string>>
- */
- private $namespace_aliased_classes_flipped = [];
-
- /**
- * @var array<string, array<string, string>>
- */
- private $namespace_aliased_classes_flipped_replaceable = [];
-
- /**
- * @var array<lowercase-string, InterfaceAnalyzer>
- */
- public $interface_analyzers_to_analyze = [];
-
- /**
- * @var array<lowercase-string, ClassAnalyzer>
- */
- 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<int, PhpParser\Node\Stmt> $stmts
- *
- * @return list<PhpParser\Node\Stmt>
- */
- 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<lowercase-string, string>
- */
- 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<string, string>
- */
- 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<string>
- */
- public function getRequiredFilePaths(): array
- {
- return array_keys($this->required_file_paths);
- }
-
- /**
- * @return list<string>
- */
- public function getParentFilePaths(): array
- {
- return array_keys($this->parent_file_paths);
- }
-
- public function getRequireNesting(): int
- {
- return count($this->parent_file_paths);
- }
-
- /**
- * @return array<string>
- */
- public function getSuppressedIssues(): array
- {
- return $this->suppressed_issues;
- }
-
- /**
- * @param array<int, string> $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<int, string> $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<string, array<string, Union>>|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 c11aa47..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\Config;
-use Psalm\Context;
-use UnexpectedValueException;
-
-use function is_string;
-use function strtolower;
-
-/**
- * @internal
- * @extends FunctionLikeAnalyzer<PhpParser\Node\Stmt\Function_>
- */
-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 d6f1d7e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php
+++ /dev/null
@@ -1,978 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\FunctionLike;
-
-use PhpParser;
-use PhpParser\Node\Expr\ArrowFunction;
-use PhpParser\Node\Expr\Closure;
-use PhpParser\Node\FunctionLike;
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\Node\Stmt\Function_;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\InterfaceAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\SourceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\FileManipulation\FunctionDocblockManipulator;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ImplicitToStringCast;
-use Psalm\Issue\InvalidFalsableReturnType;
-use Psalm\Issue\InvalidNullableReturnType;
-use Psalm\Issue\InvalidParent;
-use Psalm\Issue\InvalidReturnType;
-use Psalm\Issue\InvalidToString;
-use Psalm\Issue\LessSpecificReturnType;
-use Psalm\Issue\MismatchingDocblockReturnType;
-use Psalm\Issue\MissingClosureReturnType;
-use Psalm\Issue\MissingReturnType;
-use Psalm\Issue\MixedInferredReturnType;
-use Psalm\Issue\MixedReturnTypeCoercion;
-use Psalm\Issue\MoreSpecificReturnType;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-use function array_diff;
-use function array_filter;
-use function array_values;
-use function count;
-use function in_array;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class ReturnTypeAnalyzer
-{
- /**
- * @param Closure|Function_|ClassMethod|ArrowFunction $function
- * @param PhpParser\Node\Stmt[] $function_stmts
- * @param string[] $compatible_method_ids
- *
- * @return false|null
- *
- * @psalm-suppress PossiblyUnusedReturnValue unused but seems important
- */
- public static function verifyReturnType(
- FunctionLike $function,
- array $function_stmts,
- SourceAnalyzer $source,
- NodeDataProvider $type_provider,
- FunctionLikeAnalyzer $function_like_analyzer,
- ?Union $return_type = null,
- ?string $fq_class_name = null,
- ?string $static_fq_class_name = null,
- ?CodeLocation $return_type_location = null,
- array $compatible_method_ids = [],
- bool $did_explicitly_return = false,
- bool $closure_inside_call = false
- ): ?bool {
- $suppressed_issues = $function_like_analyzer->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 f0ab1bc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php
+++ /dev/null
@@ -1,384 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\FunctionLike;
-
-use PhpParser;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function array_merge;
-
-/**
- * A class for analysing a given method call's effects in relation to $this/self and also looking at return types
- */
-class ReturnTypeCollector
-{
- /**
- * Gets the return types from a list of statements
- *
- * @param array<PhpParser\Node> $stmts
- * @param list<Union> $yield_types
- *
- * @return list<Union> 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<Union> $return_types
- * @param non-empty-list<Union> $yield_types
- * @return non-empty-list<Union>
- */
- 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<Union>
- */
- 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 385a954..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php
+++ /dev/null
@@ -1,2023 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use PhpParser\Node\Expr\ArrowFunction;
-use PhpParser\Node\Expr\Closure;
-use PhpParser\Node\Param;
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\Node\Stmt\Function_;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\FunctionLike\ReturnTypeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLike\ReturnTypeCollector;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\FileManipulation\FunctionDocblockManipulator;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\PhpVisitor\NodeCounterVisitor;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\InvalidDocblockParamName;
-use Psalm\Issue\InvalidParamDefault;
-use Psalm\Issue\InvalidThrow;
-use Psalm\Issue\MethodSignatureMismatch;
-use Psalm\Issue\MismatchingDocblockParamType;
-use Psalm\Issue\MissingClosureParamType;
-use Psalm\Issue\MissingParamType;
-use Psalm\Issue\MissingThrowsDocblock;
-use Psalm\Issue\ReferenceConstraintViolation;
-use Psalm\Issue\ReservedWord;
-use Psalm\Issue\UnusedClosureParam;
-use Psalm\Issue\UnusedParam;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEvent;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_combine;
-use function array_diff_key;
-use function array_key_exists;
-use function array_keys;
-use function array_merge;
-use function array_search;
-use function array_values;
-use function count;
-use function end;
-use function in_array;
-use function is_string;
-use function mb_strpos;
-use function md5;
-use function microtime;
-use function reset;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- * @template-covariant TFunction as Closure|Function_|ClassMethod|ArrowFunction
- */
-abstract class FunctionLikeAnalyzer extends SourceAnalyzer
-{
- /**
- * @var TFunction
- */
- protected $function;
-
- /**
- * @var Codebase
- */
- protected $codebase;
-
- /**
- * @var array<string>
- */
- protected $suppressed_issues;
-
- /**
- * @var bool
- */
- protected $is_static = false;
-
- /**
- * @var ?array<string, Union>
- */
- protected $return_vars_in_scope = [];
-
- /**
- * @var ?array<string, bool>
- */
- protected $return_vars_possibly_in_scope = [];
-
- /**
- * @var Union|null
- */
- private $local_return_type;
-
- /**
- * @var array<string, bool>
- */
- 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<string, DataFlowNode>
- */
- 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<empty, empty>'
- ) {
- $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<FunctionLikeParameter> $params
- * @param list<Param> $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<PhpParser\Node\Stmt> $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<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array
- {
- if ($this->source instanceof NamespaceAnalyzer ||
- $this->source instanceof FileAnalyzer ||
- $this->source instanceof ClassLikeAnalyzer
- ) {
- return $this->source->getAliasedClassesFlipped();
- }
-
- return [];
- }
-
- /**
- * @return array<string, string>
- */
- public function getAliasedClassesFlippedReplaceable(): array
- {
- if ($this->source instanceof NamespaceAnalyzer ||
- $this->source instanceof FileAnalyzer ||
- $this->source instanceof ClassLikeAnalyzer
- ) {
- return $this->source->getAliasedClassesFlippedReplaceable();
- }
-
- return [];
- }
-
- /**
- * @return array<string, array<string, Union>>|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<string>
- */
- public function getSuppressedIssues(): array
- {
- return $this->suppressed_issues;
- }
-
- /**
- * @param array<int, string> $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<int, string> $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<string, MethodIdentifier>
- * }|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 9c68e2e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use InvalidArgumentException;
-use LogicException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Issue\ParseError;
-use Psalm\Issue\UndefinedInterface;
-use Psalm\IssueBuffer;
-use UnexpectedValueException;
-
-/**
- * @internal
- */
-class InterfaceAnalyzer extends ClassLikeAnalyzer
-{
- public function __construct(
- PhpParser\Node\Stmt\Interface_ $interface,
- SourceAnalyzer $source,
- string $fq_interface_name
- ) {
- parent::__construct($interface, $source, $fq_interface_name);
- }
-
- public function analyze(): void
- {
- if (!$this->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 4ab16f2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/IssueData.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use function str_pad;
-
-use const STR_PAD_LEFT;
-
-class IssueData
-{
- /**
- * @var string
- */
- public $severity;
-
- /**
- * @var int
- */
- public $line_from;
-
- /**
- * @var int
- */
- public $line_to;
-
- /**
- * @var string
- * @readonly
- */
- public $type;
-
- /**
- * @var string
- * @readonly
- */
- public $message;
-
- /**
- * @var string
- * @readonly
- */
- public $file_name;
-
- /**
- * @var string
- * @readonly
- */
- public $file_path;
-
- /**
- * @var string
- * @readonly
- */
- public $snippet;
-
- /**
- * @var string
- * @readonly
- */
- public $selected_text;
-
- /**
- * @var int
- */
- public $from;
-
- /**
- * @var int
- */
- public $to;
-
- /**
- * @var int
- */
- public $snippet_from;
-
- /**
- * @var int
- */
- public $snippet_to;
-
- /**
- * @var int
- * @readonly
- */
- public $column_from;
-
- /**
- * @var int
- * @readonly
- */
- public $column_to;
-
- /**
- * @var int
- */
- public $error_level;
-
- /**
- * @var int
- * @readonly
- */
- public $shortcode;
-
- /**
- * @var string
- * @readonly
- */
- public $link;
-
- /**
- * @var ?list<DataFlowNodeData|array{label: string, entry_path_type: string}>
- */
- public $taint_trace;
-
- /**
- * @var ?list<DataFlowNodeData>
- */
- public $other_references;
-
- /**
- * @var ?string
- * @readonly
- */
- public $dupe_key;
-
- /**
- * @param ?list<DataFlowNodeData|array{label: string, entry_path_type: string}> $taint_trace
- * @param ?list<DataFlowNodeData> $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 a3b02c1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodAnalyzer.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use LogicException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\InvalidStaticInvocation;
-use Psalm\Issue\MethodSignatureMustOmitReturnType;
-use Psalm\Issue\NonStaticSelfCall;
-use Psalm\Issue\UndefinedMethod;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use Psalm\Storage\MethodStorage;
-use UnexpectedValueException;
-
-use function in_array;
-use function strtolower;
-
-/**
- * @internal
- * @extends FunctionLikeAnalyzer<PhpParser\Node\Stmt\ClassMethod>
- */
-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<string> $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 16ff2d9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/MethodComparator.php
+++ /dev/null
@@ -1,1080 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\NodeTraverser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\PhpVisitor\ParamReplacementVisitor;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ConstructorSignatureMismatch;
-use Psalm\Issue\ImplementedParamTypeMismatch;
-use Psalm\Issue\ImplementedReturnTypeMismatch;
-use Psalm\Issue\LessSpecificImplementedReturnType;
-use Psalm\Issue\MethodSignatureMismatch;
-use Psalm\Issue\MissingImmutableAnnotation;
-use Psalm\Issue\MoreSpecificImplementedParamType;
-use Psalm\Issue\OverriddenMethodAccess;
-use Psalm\Issue\ParamNameMismatch;
-use Psalm\Issue\TraitMethodSignatureMismatch;
-use Psalm\IssueBuffer;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function in_array;
-use function strpos;
-use function strtolower;
-
-class MethodComparator
-{
- /**
- * @param string[] $suppressed_issues
- *
- * @return false|null
- *
- * @psalm-suppress PossiblyUnusedReturnValue unused but seems important
- */
- public static function compare(
- Codebase $codebase,
- ?ClassMethod $stmt,
- ClassLikeStorage $implementer_classlike_storage,
- ClassLikeStorage $guide_classlike_storage,
- MethodStorage $implementer_method_storage,
- MethodStorage $guide_method_storage,
- string $implementer_called_class_name,
- int $implementer_visibility,
- CodeLocation $code_location,
- array $suppressed_issues,
- bool $prevent_abstract_override = true,
- bool $prevent_method_signature_mismatch = true
- ): ?bool {
- $implementer_method_id = new MethodIdentifier(
- $implementer_classlike_storage->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<string, array<string, Union>> $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 06413e6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php
+++ /dev/null
@@ -1,280 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use InvalidArgumentException;
-use PhpParser;
-use PhpParser\Node\Stmt\Namespace_;
-use Psalm\Context;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Type;
-use Psalm\Type\Union;
-use ReflectionProperty;
-use UnexpectedValueException;
-
-use function assert;
-use function count;
-use function implode;
-use function preg_replace;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class NamespaceAnalyzer extends SourceAnalyzer
-{
- use CanAlias;
-
- /**
- * @var FileAnalyzer
- * @psalm-suppress NonInvariantDocblockPropertyType
- */
- protected $source;
-
- /**
- * @var Namespace_
- */
- private $namespace;
-
- /**
- * @var string
- */
- private $namespace_name;
-
- /**
- * A lookup table for public namespace constants
- *
- * @var array<string, array<string, Union>>
- */
- 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<string, Union>
- */
- 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<string> $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<non-empty-string>
- *
- * @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 40b3316..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php
+++ /dev/null
@@ -1,1527 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use Amp\Loop;
-use InvalidArgumentException;
-use LogicException;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Exception\RefactorException;
-use Psalm\Exception\UnsupportedIssueToFixException;
-use Psalm\FileManipulation;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\LanguageServer\LanguageServer;
-use Psalm\Internal\LanguageServer\ProtocolStreamReader;
-use Psalm\Internal\LanguageServer\ProtocolStreamWriter;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\ParserCacheProvider;
-use Psalm\Internal\Provider\ProjectCacheProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\Internal\Provider\StatementsProvider;
-use Psalm\Issue\CodeIssue;
-use Psalm\Issue\InvalidFalsableReturnType;
-use Psalm\Issue\InvalidNullableReturnType;
-use Psalm\Issue\InvalidReturnType;
-use Psalm\Issue\LessSpecificReturnType;
-use Psalm\Issue\MismatchingDocblockParamType;
-use Psalm\Issue\MismatchingDocblockReturnType;
-use Psalm\Issue\MissingClosureReturnType;
-use Psalm\Issue\MissingParamType;
-use Psalm\Issue\MissingPropertyType;
-use Psalm\Issue\MissingReturnType;
-use Psalm\Issue\ParamNameMismatch;
-use Psalm\Issue\PossiblyUndefinedGlobalVariable;
-use Psalm\Issue\PossiblyUndefinedVariable;
-use Psalm\Issue\PossiblyUnusedMethod;
-use Psalm\Issue\PossiblyUnusedProperty;
-use Psalm\Issue\RedundantCast;
-use Psalm\Issue\RedundantCastGivenDocblockType;
-use Psalm\Issue\UnnecessaryVarAnnotation;
-use Psalm\Issue\UnusedMethod;
-use Psalm\Issue\UnusedProperty;
-use Psalm\Issue\UnusedVariable;
-use Psalm\Plugin\EventHandler\Event\AfterCodebasePopulatedEvent;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Psalm\Report;
-use Psalm\Report\ReportOptions;
-use Psalm\Type;
-use ReflectionProperty;
-use RuntimeException;
-use UnexpectedValueException;
-
-use function array_combine;
-use function array_diff;
-use function array_fill_keys;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_shift;
-use function cli_set_process_title;
-use function count;
-use function defined;
-use function dirname;
-use function end;
-use function explode;
-use function extension_loaded;
-use function file_exists;
-use function file_get_contents;
-use function filter_var;
-use function function_exists;
-use function fwrite;
-use function implode;
-use function in_array;
-use function ini_get;
-use function is_dir;
-use function is_file;
-use function is_int;
-use function is_readable;
-use function is_string;
-use function microtime;
-use function mkdir;
-use function number_format;
-use function pcntl_fork;
-use function preg_match;
-use function rename;
-use function shell_exec;
-use function stream_set_blocking;
-use function stream_socket_accept;
-use function stream_socket_client;
-use function stream_socket_server;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function substr_count;
-use function trim;
-use function usort;
-use function version_compare;
-
-use const FILTER_VALIDATE_INT;
-use const PHP_EOL;
-use const PHP_OS;
-use const PHP_VERSION;
-use const PSALM_VERSION;
-use const STDERR;
-use const STDIN;
-use const STDOUT;
-
-/**
- * @internal
- */
-class ProjectAnalyzer
-{
- /**
- * Cached config
- *
- * @var Config
- */
- private $config;
-
- /**
- * @var self
- */
- public static $instance;
-
- /**
- * An object representing everything we know about the code
- *
- * @var Codebase
- */
- private $codebase;
-
- /** @var FileProvider */
- private $file_provider;
-
- /** @var ClassLikeStorageProvider */
- private $classlike_storage_provider;
-
- /** @var ?ParserCacheProvider */
- private $parser_cache_provider;
-
- /** @var ?ProjectCacheProvider */
- public $project_cache_provider;
-
- /** @var FileReferenceProvider */
- private $file_reference_provider;
-
- /**
- * @var Progress
- */
- public $progress;
-
- /**
- * @var bool
- */
- public $debug_lines = false;
-
- /**
- * @var bool
- */
- public $debug_performance = false;
-
- /**
- * @var bool
- */
- public $show_issues = true;
-
- /** @var int */
- public $threads;
-
- /**
- * @var array<string, bool>
- */
- 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<string,string>
- */
- private $project_files = [];
-
- /**
- * @var array<string,string>
- */
- private $extra_files = [];
-
- /**
- * @var array<string, string>
- */
- private $to_refactor = [];
-
- /**
- * @var ?ReportOptions
- */
- public $stdout_report_options;
-
- /**
- * @var array<ReportOptions>
- */
- public $generated_report_options;
-
- /**
- * @var array<int, class-string<CodeIssue>>
- */
- 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<ReportOptions> $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<string> $report_file_paths
- * @return list<ReportOptions>
- */
- 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<string>
- */
- 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<string> $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<string> $diff_files
- *
- * @return array<string, string>
- */
- 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<string, string> $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<string, bool> $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<string, bool>
- */
- 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<int, string>
- *
- * @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 4bbbd9b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php
+++ /dev/null
@@ -1,529 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\NodeTypeProvider;
-
-use function array_diff;
-use function array_filter;
-use function array_intersect;
-use function array_merge;
-use function array_unique;
-use function array_values;
-use function count;
-use function in_array;
-use function strtolower;
-
-/**
- * @internal
- */
-class ScopeAnalyzer
-{
- public const ACTION_END = 'END';
- public const ACTION_BREAK = 'BREAK';
- public const ACTION_CONTINUE = 'CONTINUE';
- public const ACTION_LEAVE_SWITCH = 'LEAVE_SWITCH';
- public const ACTION_NONE = 'NONE';
- public const ACTION_RETURN = 'RETURN';
-
- /**
- * @param array<PhpParser\Node\Stmt> $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<PhpParser\Node> $stmts
- * @param array<lowercase-string, bool> $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<self::ACTION_*>
- *
- * @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<PhpParser\Node> $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 8be2d28..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/SourceAnalyzer.php
+++ /dev/null
@@ -1,182 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use Psalm\Aliases;
-use Psalm\Codebase;
-use Psalm\NodeTypeProvider;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-abstract class SourceAnalyzer implements StatementsSource
-{
- /**
- * @var SourceAnalyzer
- */
- protected $source;
-
- public function __destruct()
- {
- unset($this->source);
- }
-
- public function getAliases(): Aliases
- {
- return $this->source->getAliases();
- }
-
- /**
- * @return array<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array
- {
- return $this->source->getAliasedClassesFlipped();
- }
-
- /**
- * @return array<string, string>
- */
- 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<string>
- */
- public function getSuppressedIssues(): array
- {
- return $this->source->getSuppressedIssues();
- }
-
- /**
- * @param array<int, string> $new_issues
- */
- public function addSuppressedIssues(array $new_issues): void
- {
- $this->source->addSuppressedIssues($new_issues);
- }
-
- /**
- * @param array<int, string> $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<string, array<string, Union>>|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 aeeb964..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php
+++ /dev/null
@@ -1,210 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-use UnexpectedValueException;
-
-use function array_diff;
-use function array_filter;
-use function array_intersect_key;
-use function array_keys;
-use function array_merge;
-use function array_values;
-use function in_array;
-use function preg_match;
-use function preg_quote;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class DoAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Do_ $stmt,
- Context $context
- ): ?bool {
- $do_context = clone $context;
- $do_context->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 c45ca9b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php
+++ /dev/null
@@ -1,190 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\Type;
-use UnexpectedValueException;
-
-use function array_intersect_key;
-use function array_merge;
-use function count;
-use function in_array;
-use function is_string;
-
-/**
- * @internal
- */
-class ForAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\For_ $stmt,
- Context $context
- ): ?bool {
- $pre_assigned_var_ids = $context->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 bdcf834..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php
+++ /dev/null
@@ -1,1149 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\InvalidIterator;
-use Psalm\Issue\NullIterator;
-use Psalm\Issue\PossibleRawObjectIteration;
-use Psalm\Issue\PossiblyFalseIterator;
-use Psalm\Issue\PossiblyInvalidIterator;
-use Psalm\Issue\PossiblyNullIterator;
-use Psalm\Issue\RawObjectIteration;
-use Psalm\Issue\UnnecessaryVarAnnotation;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TDependentListKey;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TVoid;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_intersect_key;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_search;
-use function array_values;
-use function in_array;
-use function is_string;
-use function reset;
-use function strtolower;
-
-/**
- * @internal
- */
-class ForeachAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Foreach_ $stmt,
- Context $context
- ): ?bool {
- $var_comments = [];
-
- $doc_comment = $stmt->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<string, Union> $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<string, array<string, Union>> $template_extended_params
- * @param array<string, array<string, Union>> $class_template_types
- * @param array<int, Union> $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 cd4002e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php
+++ /dev/null
@@ -1,377 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\ScopeAnalysisException;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Scope\IfConditionalScope;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\RedundantCondition;
-use Psalm\Issue\RedundantConditionGivenDocblockType;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\IssueBuffer;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function array_diff_key;
-use function array_filter;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-
-class IfConditionalAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $cond,
- Context $outer_context,
- Codebase $codebase,
- IfScope $if_scope,
- int $branch_point
- ): IfConditionalScope {
- $entry_clauses = [];
-
- // used when evaluating elseifs
- if ($if_scope->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<string, bool> */
- $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<string, int> */
- $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 f2071b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block\IfElse;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\ConflictingReferenceConstraint;
-use Psalm\IssueBuffer;
-use Psalm\Type\Reconciler;
-
-use function array_diff_key;
-use function array_key_exists;
-use function array_keys;
-use function array_merge;
-use function count;
-use function in_array;
-use function preg_match;
-use function preg_quote;
-
-class ElseAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- ?PhpParser\Node\Stmt\Else_ $else,
- IfScope $if_scope,
- Context $else_context,
- Context $outer_context
- ): ?bool {
- $codebase = $statements_analyzer->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<string, int> */
- $new_assigned_var_ids = $else_context->assigned_var_ids;
- $else_context->assigned_var_ids = $pre_stmts_assigned_var_ids;
-
- /** @var array<string, bool> */
- $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 105bf20..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php
+++ /dev/null
@@ -1,439 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block\IfElse;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Exception\ScopeAnalysisException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\AlgebraAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\ConflictingReferenceConstraint;
-use Psalm\IssueBuffer;
-use Psalm\Type\Reconciler;
-
-use function array_combine;
-use function array_diff;
-use function array_diff_key;
-use function array_filter;
-use function array_key_exists;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_reduce;
-use function array_unique;
-use function array_values;
-use function count;
-use function in_array;
-use function preg_match;
-use function preg_quote;
-use function spl_object_id;
-
-class ElseIfAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\ElseIf_ $elseif,
- IfScope $if_scope,
- Context $else_context,
- Context $outer_context,
- Codebase $codebase,
- int $branch_point
- ): ?bool {
- $pre_conditional_context = clone $else_context;
-
- try {
- $if_conditional_scope = IfConditionalAnalyzer::analyze(
- $statements_analyzer,
- $elseif->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<string> $carry
- * @return array<string>
- */
- 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<string, int> */
- $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<string, bool> */
- $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 005a272..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php
+++ /dev/null
@@ -1,532 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block\IfElse;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Scope\IfConditionalScope;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\ConflictingReferenceConstraint;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\BinaryOp\VirtualBooleanOr;
-use Psalm\Node\Expr\VirtualBooleanNot;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\VirtualArg;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function array_diff_key;
-use function array_filter;
-use function array_intersect;
-use function array_intersect_key;
-use function array_keys;
-use function array_merge;
-use function array_unique;
-use function count;
-use function in_array;
-use function strpos;
-use function substr;
-
-class IfAnalyzer
-{
- /**
- * @param array<string, Union> $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<string, int> */
- $new_assigned_var_ids = $if_context->assigned_var_ids;
- /** @var array<string, bool> */
- $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<string, int> $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<string, int> $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<PhpParser\Node\Expr>
- */
- 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<string, int> $assigned_var_ids
- * @param array<string, bool> $possibly_assigned_var_ids
- * @param array<string, bool> $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 1f9dcc3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php
+++ /dev/null
@@ -1,509 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Exception\ScopeAnalysisException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\AlgebraAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElse\ElseAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElse\ElseIfAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Node\Expr\VirtualBooleanNot;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-
-use function array_combine;
-use function array_diff;
-use function array_diff_key;
-use function array_filter;
-use function array_intersect_key;
-use function array_key_exists;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_reduce;
-use function array_unique;
-use function array_values;
-use function count;
-use function in_array;
-use function preg_match;
-use function preg_quote;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class IfElseAnalyzer
-{
- /**
- * System of type substitution and deletion
- *
- * for example
- *
- * x: A|null
- *
- * if (x)
- * (x: A)
- * x = B -- effects: remove A from the type of x, add B
- * else
- * (x: null)
- * x = C -- effects: remove null from the type of x, add C
- *
- *
- * x: A|null
- *
- * if (!x)
- * (x: null)
- * throw new Exception -- effects: remove null from the type of x
- *
- *
- * @return null|false
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\If_ $stmt,
- Context $context
- ): ?bool {
- $codebase = $statements_analyzer->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<string> $carry
- * @return array<string>
- */
- 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 1cfd402..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php
+++ /dev/null
@@ -1,735 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\PhpVisitor\AssignmentMapVisitor;
-use Psalm\Internal\PhpVisitor\NodeCleanerVisitor;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-
-use function array_intersect_key;
-use function array_keys;
-use function array_merge;
-use function array_unique;
-use function in_array;
-use function spl_object_id;
-use function strpos;
-
-/**
- * @internal
- */
-class LoopAnalyzer
-{
- /**
- * Checks an array of statements in a loop
- *
- * @param array<PhpParser\Node\Stmt> $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<Clause> $pre_condition_clauses
- *
- * @return list<string>
- */
- 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<string, array<string, bool>> $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 fd492eb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scope\SwitchScope;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-use SplFixedArray;
-
-use function array_merge;
-use function count;
-use function in_array;
-
-/**
- * @internal
- */
-class SwitchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Switch_ $stmt,
- Context $context
- ): void {
- $codebase = $statements_analyzer->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 d8802a1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php
+++ /dev/null
@@ -1,769 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\AlgebraAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\PhpVisitor\ConditionCloningVisitor;
-use Psalm\Internal\PhpVisitor\TypeMappingVisitor;
-use Psalm\Internal\Scope\CaseScope;
-use Psalm\Internal\Scope\SwitchScope;
-use Psalm\Issue\ContinueOutsideLoop;
-use Psalm\Issue\ParadoxicalCondition;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\BinaryOp\VirtualBooleanOr;
-use Psalm\Node\Expr\BinaryOp\VirtualEqual;
-use Psalm\Node\Expr\BinaryOp\VirtualIdentical;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Expr\VirtualBooleanNot;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\Scalar\VirtualLNumber;
-use Psalm\Node\Stmt\VirtualIf;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualName;
-use Psalm\Type;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TDependentGetDebugType;
-use Psalm\Type\Atomic\TDependentGetType;
-use Psalm\Type\Reconciler;
-
-use function array_diff_key;
-use function array_intersect_key;
-use function array_merge;
-use function count;
-use function in_array;
-use function is_string;
-use function spl_object_id;
-use function strpos;
-use function substr;
-
-/**
- * @internal
- */
-class SwitchCaseAnalyzer
-{
- /**
- * @return null|false
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- Codebase $codebase,
- PhpParser\Node\Stmt\Switch_ $stmt,
- ?string $switch_var_id,
- PhpParser\Node\Stmt\Case_ $case,
- Context $context,
- Context $original_context,
- string $case_exit_type,
- array $case_actions,
- bool $is_last,
- SwitchScope $switch_scope
- ): ?bool {
- // has a return/throw at end
- $has_ending_statements = $case_actions === [ScopeAnalyzer::ACTION_END];
- $has_leaving_statements = $has_ending_statements
- || (count($case_actions) && !in_array(ScopeAnalyzer::ACTION_NONE, $case_actions, true));
-
- $case_context = clone $original_context;
-
- if ($codebase->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<string, int> */
- $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<string, bool> */
- $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<PhpParser\Node\Expr\ArrayItem> $in_array_values
- * @return ?array<PhpParser\Node\Expr\ArrayItem>
- */
- 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 5074bd6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php
+++ /dev/null
@@ -1,516 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Scope\FinallyScope;
-use Psalm\Issue\InvalidCatch;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_intersect_key;
-use function array_map;
-use function array_merge;
-use function in_array;
-use function is_string;
-use function strtolower;
-use function version_compare;
-
-use const PHP_VERSION;
-
-/**
- * @internal
- */
-class TryAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\TryCatch $stmt,
- Context $context
- ): ?bool {
- $catch_actions = [];
- $all_catches_leave = true;
-
- $codebase = $statements_analyzer->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<string, array<array-key, CodeLocation>> $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<string, int> */
- $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<string, bool> */
- $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 a6ef17d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Block;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scope\LoopScope;
-use Psalm\Type;
-use UnexpectedValueException;
-
-use function array_intersect_key;
-use function array_merge;
-use function in_array;
-
-/**
- * @internal
- */
-class WhileAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\While_ $stmt,
- Context $context
- ): ?bool {
- $while_true = ($stmt->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<PhpParser\Node\Expr>
- */
- 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 2a98856..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-
-use function end;
-
-class BreakAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Break_ $stmt,
- Context $context
- ): void {
- $loop_scope = $context->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 17826f1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Issue\ContinueOutsideLoop;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-
-use function end;
-
-class ContinueAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Continue_ $stmt,
- Context $context
- ): void {
- $count = $stmt->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 8b9be56..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CastAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\ForbiddenEcho;
-use Psalm\Issue\ImpureFunctionCall;
-use Psalm\IssueBuffer;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\TaintKind;
-
-class EchoAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Echo_ $stmt,
- Context $context
- ): bool {
- $echo_param = new FunctionLikeParameter(
- 'var',
- false
- );
-
- $codebase = $statements_analyzer->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 0a92b1a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php
+++ /dev/null
@@ -1,607 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Issue\DuplicateArrayKey;
-use Psalm\Issue\InvalidArrayOffset;
-use Psalm\Issue\MixedArrayOffset;
-use Psalm\Issue\ParseError;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function array_values;
-use function count;
-use function in_array;
-use function is_string;
-use function preg_match;
-
-use const PHP_INT_MAX;
-
-/**
- * @internal
- */
-class ArrayAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Array_ $stmt,
- Context $context
- ): bool {
- // if the array is empty, this special type allows us to match any other array type against it
- if (empty($stmt->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 ca0e761..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-class ArrayCreationInfo
-{
- /**
- * @var list<Atomic>
- */
- public $item_key_atomic_types = [];
-
- /**
- * @var list<Atomic>
- */
- public $item_value_atomic_types = [];
-
- /**
- * @var array<int|string, Union>
- */
- public $property_types = [];
-
- /**
- * @var array<string, true>
- */
- public $class_strings = [];
-
- /**
- * @var bool
- */
- public $can_create_objectlike = true;
-
- /**
- * @var array<int|string, true>
- */
- public $array_keys = [];
-
- /**
- * @var int
- */
- public $int_offset = 0;
-
- /**
- * @var bool
- */
- public $all_list = true;
-
- /**
- * @var array<string, DataFlowNode>
- */
- 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 0fa53ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php
+++ /dev/null
@@ -1,4122 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use PhpParser\Node\Expr\BinaryOp;
-use PhpParser\Node\Expr\BinaryOp\Equal;
-use PhpParser\Node\Expr\BinaryOp\Greater;
-use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual;
-use PhpParser\Node\Expr\BinaryOp\Identical;
-use PhpParser\Node\Expr\BinaryOp\NotEqual;
-use PhpParser\Node\Expr\BinaryOp\NotIdentical;
-use PhpParser\Node\Expr\BinaryOp\Smaller;
-use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual;
-use PhpParser\Node\Expr\UnaryMinus;
-use PhpParser\Node\Expr\UnaryPlus;
-use PhpParser\Node\Scalar\LNumber;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\FileSource;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\RedundantCondition;
-use Psalm\Issue\RedundantConditionGivenDocblockType;
-use Psalm\Issue\RedundantIdentityWithTrue;
-use Psalm\Issue\TypeDoesNotContainNull;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\Issue\UnevaluatedCode;
-use Psalm\IssueBuffer;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_key_exists;
-use function assert;
-use function count;
-use function explode;
-use function in_array;
-use function is_callable;
-use function is_int;
-use function is_numeric;
-use function is_string;
-use function json_encode;
-use function sprintf;
-use function str_replace;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- * This class transform conditions in code into "assertions" that will be reconciled with the type already known of a
- * given variable to narrow the type or find paradox.
- * For example if $a is an int, if($a > 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<string>
- */
- 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<string, non-empty-list<non-empty-list<string>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>
- */
- 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 a2eb2c6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php
+++ /dev/null
@@ -1,1027 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Assignment;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Issue\InvalidArrayAssignment;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TDependentListKey;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-
-use function array_pop;
-use function array_reverse;
-use function array_shift;
-use function array_slice;
-use function array_unshift;
-use function count;
-use function implode;
-use function in_array;
-use function is_string;
-use function preg_match;
-use function strlen;
-
-/**
- * @internal
- */
-class ArrayAssignmentAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\ArrayDimFetch $stmt,
- Context $context,
- ?PhpParser\Node\Expr $assign_value,
- Union $assignment_value_type
- ): void {
- $nesting = 0;
- $var_id = ExpressionIdentifier::getVarId(
- $stmt->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<TLiteralInt|TLiteralString> $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<TLiteralInt|TLiteralString> $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<PhpParser\Node\Expr\ArrayDimFetch> $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 9756e4f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Assignment;
-
-use Psalm\Type\Union;
-
-class AssignedProperty
-{
- /**
- * @var Union
- */
- public $property_type;
-
- /**
- * @var string
- */
- public $id;
-
- /**
- * @var Union
- */
- public $assignment_type;
-
- public function __construct(
- Union $property_type,
- string $id,
- Union $assignment_type
- ) {
- $this->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 f5ebf74..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php
+++ /dev/null
@@ -1,1540 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Assignment;
-
-use PhpParser;
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\PropertyFetch;
-use PhpParser\Node\Stmt\PropertyProperty;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\AtomicPropertyFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\Methods;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DeprecatedProperty;
-use Psalm\Issue\ImplicitToStringCast;
-use Psalm\Issue\ImpurePropertyAssignment;
-use Psalm\Issue\InaccessibleProperty;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InternalProperty;
-use Psalm\Issue\InvalidPropertyAssignment;
-use Psalm\Issue\InvalidPropertyAssignmentValue;
-use Psalm\Issue\LoopInvalidation;
-use Psalm\Issue\MixedAssignment;
-use Psalm\Issue\MixedPropertyAssignment;
-use Psalm\Issue\MixedPropertyTypeCoercion;
-use Psalm\Issue\NoInterfaceProperties;
-use Psalm\Issue\NullPropertyAssignment;
-use Psalm\Issue\PossiblyFalsePropertyAssignmentValue;
-use Psalm\Issue\PossiblyInvalidPropertyAssignment;
-use Psalm\Issue\PossiblyInvalidPropertyAssignmentValue;
-use Psalm\Issue\PossiblyNullPropertyAssignment;
-use Psalm\Issue\PossiblyNullPropertyAssignmentValue;
-use Psalm\Issue\PropertyTypeCoercion;
-use Psalm\Issue\UndefinedClass;
-use Psalm\Issue\UndefinedMagicPropertyAssignment;
-use Psalm\Issue\UndefinedPropertyAssignment;
-use Psalm\Issue\UndefinedThisPropertyAssignment;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_pop;
-use function count;
-use function in_array;
-use function reset;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class InstancePropertyAssignmentAnalyzer
-{
- /**
- * @param PropertyFetch|PropertyProperty $stmt
- * @param bool $direct_assignment whether the variable is assigned explicitly
- *
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\NodeAbstract $stmt,
- string $prop_name,
- ?PhpParser\Node\Expr $assignment_value,
- Union $assignment_value_type,
- Context $context,
- bool $direct_assignment = true
- ): ?bool {
- $codebase = $statements_analyzer->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<AssignedProperty>
- */
- 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<string> $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 ebe454a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php
+++ /dev/null
@@ -1,342 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Assignment;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ImplicitToStringCast;
-use Psalm\Issue\InvalidPropertyAssignmentValue;
-use Psalm\Issue\MixedPropertyTypeCoercion;
-use Psalm\Issue\PossiblyInvalidPropertyAssignmentValue;
-use Psalm\Issue\PropertyTypeCoercion;
-use Psalm\Issue\UndefinedPropertyAssignment;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function explode;
-use function strtolower;
-
-/**
- * @internal
- */
-class StaticPropertyAssignmentAnalyzer
-{
- /**
- * @return false|null
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\StaticPropertyFetch $stmt,
- ?PhpParser\Node\Expr $assignment_value,
- Union $assignment_value_type,
- Context $context
- ): ?bool {
- $var_id = ExpressionIdentifier::getArrayVarId(
- $stmt,
- $context->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 51e9191..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php
+++ /dev/null
@@ -1,1728 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\ArrayAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\InstancePropertyAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\StaticPropertyAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Codebase\DataFlowGraph;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\ReferenceConstraint;
-use Psalm\Internal\Scanner\VarDocblockComment;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\AssignmentToVoid;
-use Psalm\Issue\ImpureByReferenceAssignment;
-use Psalm\Issue\ImpurePropertyAssignment;
-use Psalm\Issue\InvalidArrayAccess;
-use Psalm\Issue\InvalidArrayOffset;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\InvalidScope;
-use Psalm\Issue\LoopInvalidation;
-use Psalm\Issue\MissingDocblockType;
-use Psalm\Issue\MixedArrayAccess;
-use Psalm\Issue\MixedAssignment;
-use Psalm\Issue\NoValue;
-use Psalm\Issue\NullReference;
-use Psalm\Issue\PossiblyInvalidArrayAccess;
-use Psalm\Issue\PossiblyNullArrayAccess;
-use Psalm\Issue\PossiblyUndefinedArrayOffset;
-use Psalm\Issue\ReferenceConstraintViolation;
-use Psalm\Issue\UnnecessaryVarAnnotation;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\BinaryOp\VirtualBitwiseAnd;
-use Psalm\Node\Expr\BinaryOp\VirtualBitwiseOr;
-use Psalm\Node\Expr\BinaryOp\VirtualBitwiseXor;
-use Psalm\Node\Expr\BinaryOp\VirtualCoalesce;
-use Psalm\Node\Expr\BinaryOp\VirtualConcat;
-use Psalm\Node\Expr\BinaryOp\VirtualDiv;
-use Psalm\Node\Expr\BinaryOp\VirtualMinus;
-use Psalm\Node\Expr\BinaryOp\VirtualMod;
-use Psalm\Node\Expr\BinaryOp\VirtualMul;
-use Psalm\Node\Expr\BinaryOp\VirtualPlus;
-use Psalm\Node\Expr\BinaryOp\VirtualPow;
-use Psalm\Node\Expr\BinaryOp\VirtualShiftLeft;
-use Psalm\Node\Expr\BinaryOp\VirtualShiftRight;
-use Psalm\Node\Expr\VirtualAssign;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_merge;
-use function count;
-use function in_array;
-use function is_string;
-use function reset;
-use function spl_object_id;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class AssignmentAnalyzer
-{
- /**
- * @param PhpParser\Node\Expr|null $assign_value This has to be null to support list destructuring
- *
- * @return false|Union
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $assign_var,
- ?PhpParser\Node\Expr $assign_value,
- ?Union $assign_value_type,
- Context $context,
- ?PhpParser\Comment\Doc $doc_comment,
- array $not_ignored_docblock_var_ids = []
- ) {
- $var_id = ExpressionIdentifier::getVarId(
- $assign_var,
- $statements_analyzer->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<string> $removed_taints
- * @param array<string> $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<empty, empty>') {
- $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<VarDocblockComment> $var_comments
- * @param list<string> $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-><autocompleted>, 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 1f4c28f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Node\Stmt\VirtualExpression;
-use Psalm\Node\Stmt\VirtualIf;
-use Psalm\Type\Reconciler;
-
-use function array_diff_key;
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-use function in_array;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class AndAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BinaryOp $stmt,
- Context $context,
- bool $from_stmt = false
- ): bool {
- if ($from_stmt) {
- $fake_if_stmt = new VirtualIf(
- $stmt->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<string> $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<string, bool> */
- $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 2aa814c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php
+++ /dev/null
@@ -1,1373 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\ArrayAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Issue\FalseOperand;
-use Psalm\Issue\InvalidOperand;
-use Psalm\Issue\MixedOperand;
-use Psalm\Issue\NullOperand;
-use Psalm\Issue\PossiblyFalseOperand;
-use Psalm\Issue\PossiblyInvalidOperand;
-use Psalm\Issue\PossiblyNullOperand;
-use Psalm\Issue\StringIncrement;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_diff_key;
-use function array_values;
-use function count;
-use function is_int;
-use function is_numeric;
-use function max;
-use function min;
-use function preg_match;
-use function strtolower;
-
-/**
- * @internal
- */
-class ArithmeticOpAnalyzer
-{
- public static function analyze(
- ?StatementsSource $statements_source,
- NodeDataProvider $nodes,
- PhpParser\Node\Expr $left,
- PhpParser\Node\Expr $right,
- PhpParser\Node $parent,
- ?Union &$result_type = null,
- ?Context $context = null
- ): void {
- $codebase = $statements_source ? $statements_source->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 f5c7580..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Node\Expr\VirtualIsset;
-use Psalm\Node\Expr\VirtualTernary;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Type;
-
-use function substr;
-
-/**
- * @internal
- */
-class CoalesceAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BinaryOp\Coalesce $stmt,
- Context $context
- ): bool {
- $left_expr = $stmt->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 = '$<tmp coalesce var>' . (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 e317de4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php
+++ /dev/null
@@ -1,432 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\FalseOperand;
-use Psalm\Issue\ImplicitToStringCast;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\InvalidOperand;
-use Psalm\Issue\MixedOperand;
-use Psalm\Issue\NullOperand;
-use Psalm\Issue\PossiblyFalseOperand;
-use Psalm\Issue\PossiblyInvalidOperand;
-use Psalm\Issue\PossiblyNullOperand;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function assert;
-use function count;
-use function reset;
-use function strlen;
-
-/**
- * @internal
- */
-class ConcatAnalyzer
-{
- private const MAX_LITERALS = 64;
-
- /**
- * @param Union|null $result_type
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $left,
- PhpParser\Node\Expr $right,
- Context $context,
- Union &$result_type = null
- ): void {
- $codebase = $statements_analyzer->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 c438111..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class NonComparisonOpAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BinaryOp $stmt,
- Context $context
- ): void {
- $stmt_left_type = $statements_analyzer->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 d584d43..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php
+++ /dev/null
@@ -1,411 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\BinaryOp;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Exception\ScopeAnalysisException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Type\AssertionReconciler;
-use Psalm\Node\Expr\VirtualBooleanNot;
-use Psalm\Node\Stmt\VirtualExpression;
-use Psalm\Node\Stmt\VirtualIf;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-
-use function array_diff_key;
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-use function in_array;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class OrAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BinaryOp $stmt,
- Context $context,
- bool $from_stmt = false
- ): bool {
- if ($from_stmt) {
- $fake_if_stmt = new VirtualIf(
- new VirtualBooleanNot($stmt->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 5a4108c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php
+++ /dev/null
@@ -1,530 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\CoalesceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ConcatAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\NonComparisonOpAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\OrAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\InvalidOperand;
-use Psalm\Issue\RedundantCondition;
-use Psalm\Issue\RedundantConditionGivenDocblockType;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function in_array;
-use function strlen;
-
-/**
- * @internal
- */
-class BinaryOpAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BinaryOp $stmt,
- Context $context,
- int $nesting = 0,
- bool $from_stmt = false
- ): bool {
- if ($stmt instanceof PhpParser\Node\Expr\BinaryOp\Concat && $nesting > 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 fa8c19d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Issue\InvalidOperand;
-use Psalm\Issue\PossiblyInvalidOperand;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-
-class BitwiseNotAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BitwiseNot $stmt,
- Context $context
- ): bool {
- if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->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 cf135ee..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-
-class BooleanNotAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\BooleanNot $stmt,
- Context $context
- ): bool {
-
-
- $inside_negation = $context->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 84b777c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php
+++ /dev/null
@@ -1,1629 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CastAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\ConstantTypeResolver;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ArgumentTypeCoercion;
-use Psalm\Issue\ImplicitToStringCast;
-use Psalm\Issue\InvalidArgument;
-use Psalm\Issue\InvalidLiteralArgument;
-use Psalm\Issue\InvalidScalarArgument;
-use Psalm\Issue\MixedArgument;
-use Psalm\Issue\MixedArgumentTypeCoercion;
-use Psalm\Issue\NamedArgumentNotAllowed;
-use Psalm\Issue\NoValue;
-use Psalm\Issue\NullArgument;
-use Psalm\Issue\PossiblyFalseArgument;
-use Psalm\Issue\PossiblyInvalidArgument;
-use Psalm\Issue\PossiblyNullArgument;
-use Psalm\IssueBuffer;
-use Psalm\Node\VirtualArg;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function explode;
-use function in_array;
-use function ord;
-use function preg_split;
-use function reset;
-use function strpos;
-use function strtolower;
-use function substr;
-
-use const PREG_SPLIT_NO_EMPTY;
-
-/**
- * @internal
- */
-class ArgumentAnalyzer
-{
- /**
- * @param array<string, array<string, Union>> $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<string, array<string, Union>> $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 cf5fe6f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\FuncCall;
-use PhpParser\Node\Expr\MethodCall;
-use PhpParser\Node\Expr\New_;
-use PhpParser\Node\Expr\StaticCall;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-
-use function array_reverse;
-use function array_shift;
-use function is_string;
-use function reset;
-use function strlen;
-use function substr;
-use function token_get_all;
-
-class ArgumentMapPopulator
-{
- /**
- * @param MethodCall|StaticCall|FuncCall|New_ $stmt
- */
- public static function recordArgumentPositions(
- StatementsAnalyzer $statements_analyzer,
- Expr $stmt,
- Codebase $codebase,
- string $function_reference
- ): void {
- $file_content = $codebase->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('<?php ' . $method_name_and_first_paren_source_code);
- $opening_paren_position = $first_argument_character;
- foreach (array_reverse($method_name_and_first_paren_tokens) as $token) {
- $token = is_string($token) ? $token : $token[1];
- $opening_paren_position -= strlen($token);
-
- if ($token === '(') {
- break;
- }
- }
-
- // New instances can be created without parens
- if ($opening_paren_position < $stmt->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('<?php ' . $range_source_code);
-
- array_shift($range_tokens);
-
- $current_position = $position;
- foreach ($range_tokens as $token) {
- $token = is_string($token) ? $token : $token[1];
-
- if ($token === ',') {
- $commas[] = $current_position;
- }
-
- $current_position += strlen($token);
- }
- }
- }
-
- $argument_start_position = $opening_paren_position + 1;
- $argument_number = 0;
- while (!empty($commas)) {
- $comma = reset($commas);
- array_shift($commas);
-
- $codebase->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 c3930b7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php
+++ /dev/null
@@ -1,1620 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\AttributesAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\ConstantTypeResolver;
-use Psalm\Internal\Codebase\Functions;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Stubs\Generator\StubsGenerator;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\InvalidNamedArgument;
-use Psalm\Issue\InvalidPassByReference;
-use Psalm\Issue\PossiblyUndefinedVariable;
-use Psalm\Issue\TooFewArguments;
-use Psalm\Issue\TooManyArguments;
-use Psalm\IssueBuffer;
-use Psalm\Node\VirtualArg;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_map;
-use function array_reverse;
-use function array_slice;
-use function array_values;
-use function count;
-use function in_array;
-use function is_string;
-use function max;
-use function min;
-use function reset;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class ArgumentsAnalyzer
-{
- /**
- * @param list<PhpParser\Node\Arg> $args
- * @param array<int, FunctionLikeParameter>|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<int, PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $args
- * @param string|MethodIdentifier|null $method_id
- * @param array<int,FunctionLikeParameter> $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<int, FunctionLikeParameter> $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<PhpParser\Node\Arg> $args
- * @param array<int,FunctionLikeParameter> $function_params
- * @param array<string, array<string, Union>> $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<int, PhpParser\Node\Arg> $args
- * @param string|MethodIdentifier|null $method_id
- * @param array<int,FunctionLikeParameter> $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 654e9bd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php
+++ /dev/null
@@ -1,957 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\ArrayAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ArgumentTypeCoercion;
-use Psalm\Issue\InvalidArgument;
-use Psalm\Issue\InvalidScalarArgument;
-use Psalm\Issue\MixedArgumentTypeCoercion;
-use Psalm\Issue\PossiblyInvalidArgument;
-use Psalm\Issue\TooFewArguments;
-use Psalm\Issue\TooManyArguments;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualArrayDimFetch;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_shift;
-use function array_unshift;
-use function assert;
-use function count;
-use function explode;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class ArrayFunctionArgumentsAnalyzer
-{
- /**
- * @param array<int, PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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 1450e9e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php
+++ /dev/null
@@ -1,282 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_merge;
-use function array_search;
-
-class ClassTemplateParamCollector
-{
- /**
- * @param lowercase-string $method_name
- * @return array<string, non-empty-array<string, Union>>|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<string, array<string, Union>> $e
- * @return non-empty-list<Atomic>
- */
- 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 d98cf1f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php
+++ /dev/null
@@ -1,1129 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\AlgebraAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Issue\DeprecatedFunction;
-use Psalm\Issue\ImpureFunctionCall;
-use Psalm\Issue\InvalidFunctionCall;
-use Psalm\Issue\MixedFunctionCall;
-use Psalm\Issue\NullFunctionCall;
-use Psalm\Issue\PossiblyInvalidFunctionCall;
-use Psalm\Issue\PossiblyNullFunctionCall;
-use Psalm\Issue\UnusedFunctionCall;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Plugin\EventHandler\Event\AfterEveryFunctionCallAnalysisEvent;
-use Psalm\Storage\Assertion;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Reconciler;
-use Psalm\Type\TaintKind;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_map;
-use function array_merge;
-use function array_shift;
-use function array_slice;
-use function count;
-use function explode;
-use function implode;
-use function in_array;
-use function preg_replace;
-use function reset;
-use function spl_object_id;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class FunctionCallAnalyzer extends CallAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\FuncCall $stmt,
- Context $context
- ): bool {
- $function_name = $stmt->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 61984a8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class FunctionCallInfo
-{
- /**
- * @var ?string
- */
- public $function_id;
-
- /**
- * @var ?bool
- */
- public $function_exists;
-
- /**
- * @var bool
- */
- public $is_stubbed = false;
-
- /**
- * @var bool
- */
- public $in_call_map = false;
-
- /**
- * @var array<string, Union>
- */
- public $defined_constants = [];
-
- /**
- * @var array<string, bool>
- */
- public $global_variables = [];
-
- /**
- * @var ?array<int, FunctionLikeParameter>
- */
- 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 a843e94..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php
+++ /dev/null
@@ -1,861 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use InvalidArgumentException;
-use PhpParser;
-use PhpParser\BuilderFactory;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Plugin\EventHandler\Event\AfterFunctionCallAnalysisEvent;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_values;
-use function count;
-use function explode;
-use function in_array;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class FunctionCallReturnTypeFetcher
-{
- /**
- * @param non-empty-string $function_id
- */
- public static function fetch(
- StatementsAnalyzer $statements_analyzer,
- Codebase $codebase,
- PhpParser\Node\Expr\FuncCall $stmt,
- PhpParser\Node\Name $function_name,
- string $function_id,
- bool $in_call_map,
- bool $is_stubbed,
- ?FunctionLikeStorage $function_storage,
- ?TCallable $callmap_callable,
- TemplateResult $template_result,
- Context $context
- ): Union {
- $stmt_type = null;
- $config = $codebase->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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $args
- * @param array<string> $removed_taints
- * @param array<string> $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 fe0c730..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use PhpParser;
-use Psalm\Internal\MethodIdentifier;
-
-class AtomicCallContext
-{
- /** @var MethodIdentifier */
- public $method_id;
-
- /** @var list<PhpParser\Node\Arg> */
- public $args;
-
- /** @param list<PhpParser\Node\Arg> $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 e4d5d5e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Type\Union;
-
-class AtomicMethodCallAnalysisResult
-{
- /**
- * @var ?Union
- */
- public $return_type;
-
- /**
- * @var bool
- */
- public $returns_by_ref = false;
-
- /**
- * @var bool
- */
- public $has_mock = false;
-
- /**
- * @var bool
- */
- public $has_valid_method_call_type = false;
-
- /**
- * @var bool
- */
- public $has_mixed_method_call = false;
-
- /**
- * @var array<string>
- */
- public $invalid_method_call_types = [];
-
- /**
- * @var array<string>
- */
- public $existent_method_ids = [];
-
- /**
- * @var array<string>
- */
- public $non_existent_class_method_ids = [];
-
- /**
- * @var array<string>
- */
- public $non_existent_interface_method_ids = [];
-
- /**
- * @var array<string>
- */
- public $non_existent_magic_method_ids = [];
-
- /**
- * @var bool
- */
- public $check_visibility = true;
-
- /**
- * @var bool
- */
- public $too_many_arguments = true;
-
- /**
- * @var list<MethodIdentifier>
- */
- public $too_many_arguments_method_ids = [];
-
- /**
- * @var bool
- */
- public $too_few_arguments = false;
-
- /**
- * @var list<MethodIdentifier>
- */
- 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 6183fe7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php
+++ /dev/null
@@ -1,890 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\MixedMethodCall;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_merge;
-use function array_search;
-use function array_shift;
-use function array_values;
-use function count;
-use function get_class;
-use function reset;
-use function strtolower;
-
-/**
- * This is a bunch of complex logic to handle the potential for missing methods,
- * use of intersection types and/or mixins, together with handling for fallback magic
- * methods.
- *
- * The happy path (i.e 99% of method calls) is handled in ExistingAtomicMethodCallAnalyzer
- */
-class AtomicMethodCallAnalyzer extends CallAnalyzer
-{
- /**
- * @param TNamedObject|TTemplateParam|null $static_type
- *
- * @psalm-suppress ComplexMethod it's really complex, but unavoidably so
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\MethodCall $stmt,
- Codebase $codebase,
- Context $context,
- Union $lhs_type,
- Atomic $lhs_type_part,
- ?Atomic $static_type,
- bool $is_intersection,
- ?string $lhs_var_id,
- AtomicMethodCallAnalysisResult $result
- ): void {
- if ($lhs_type_part instanceof TTemplateParam
- && !$lhs_type_part->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<string, Atomic> $intersection_types
- *
- * @return array{?Union, array<string>}
- */
- 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 6dee09a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php
+++ /dev/null
@@ -1,673 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentMapPopulator;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\IfThisIsMismatch;
-use Psalm\Issue\InvalidPropertyAssignmentValue;
-use Psalm\Issue\MixedPropertyTypeCoercion;
-use Psalm\Issue\PossiblyInvalidPropertyAssignmentValue;
-use Psalm\Issue\PropertyTypeCoercion;
-use Psalm\Issue\UndefinedThisPropertyAssignment;
-use Psalm\Issue\UndefinedThisPropertyFetch;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Plugin\EventHandler\Event\AfterMethodCallAnalysisEvent;
-use Psalm\Storage\Assertion;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_map;
-use function count;
-use function explode;
-use function in_array;
-use function strtolower;
-
-class ExistingAtomicMethodCallAnalyzer extends CallAnalyzer
-{
- /**
- * @param TNamedObject|TTemplateParam|null $static_type
- * @param list<PhpParser\Node\Arg> $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 29c8bf2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\DeprecatedMethod;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InternalMethod;
-use Psalm\IssueBuffer;
-
-class MethodCallProhibitionAnalyzer
-{
- /**
- * @param string[] $suppressed_issues
- *
- * @return false|null
- */
- public static function analyze(
- Codebase $codebase,
- Context $context,
- MethodIdentifier $method_id,
- ?string $caller_identifier,
- CodeLocation $code_location,
- array $suppressed_issues
- ): ?bool {
- $codebase_methods = $codebase->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 d0d49fd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\InstancePropertyAssignmentAnalyzer as AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\UnusedMethodCall;
-use Psalm\IssueBuffer;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-
-class MethodCallPurityAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- Codebase $codebase,
- PhpParser\Node\Expr\MethodCall $stmt,
- ?string $lhs_var_id,
- string $cased_method_id,
- MethodIdentifier $method_id,
- MethodStorage $method_storage,
- ClassLikeStorage $class_storage,
- Context $context,
- Config $config,
- AtomicMethodCallAnalysisResult $result
- ): void {
- $method_pure_compatible = $method_storage->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 76d3dfa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php
+++ /dev/null
@@ -1,634 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use Exception;
-use PDOException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallReturnTypeFetcher;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use RuntimeException;
-use Throwable;
-use UnexpectedValueException;
-
-use function array_filter;
-use function count;
-use function in_array;
-use function strtolower;
-
-class MethodCallReturnTypeFetcher
-{
- /**
- * @param TNamedObject|TTemplateParam|null $static_type
- * @param list<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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 48ff4da..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\InaccessibleMethod;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use UnexpectedValueException;
-
-use function array_pop;
-use function end;
-use function strtolower;
-
-class MethodVisibilityAnalyzer
-{
- /**
- * @param string[] $suppressed_issues
- *
- * @return false|null
- */
- public static function analyze(
- MethodIdentifier $method_id,
- Context $context,
- StatementsSource $source,
- CodeLocation $code_location,
- array $suppressed_issues
- ): ?bool {
- $codebase = $source->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 c8c3c70..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php
+++ /dev/null
@@ -1,454 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\Method;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Node\VirtualArg;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Union;
-
-use function array_map;
-use function array_merge;
-
-class MissingMethodCallHandler
-{
- public static function handleMagicMethod(
- StatementsAnalyzer $statements_analyzer,
- Codebase $codebase,
- PhpParser\Node\Expr\MethodCall $stmt,
- MethodIdentifier $method_id,
- ClassLikeStorage $class_storage,
- Context $context,
- Config $config,
- ?Union $all_intersection_return_type,
- AtomicMethodCallAnalysisResult $result,
- ?Atomic $lhs_type_part
- ): ?AtomicCallContext {
- $fq_class_name = $method_id->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<string> $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 04f0b96..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php
+++ /dev/null
@@ -1,437 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalysisResult;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Issue\InvalidMethodCall;
-use Psalm\Issue\InvalidScope;
-use Psalm\Issue\NullReference;
-use Psalm\Issue\PossiblyFalseReference;
-use Psalm\Issue\PossiblyInvalidMethodCall;
-use Psalm\Issue\PossiblyNullReference;
-use Psalm\Issue\PossiblyUndefinedMethod;
-use Psalm\Issue\TooFewArguments;
-use Psalm\Issue\TooManyArguments;
-use Psalm\Issue\UndefinedInterfaceMethod;
-use Psalm\Issue\UndefinedMagicMethod;
-use Psalm\Issue\UndefinedMethod;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_reduce;
-use function count;
-use function is_string;
-use function strtolower;
-
-/**
- * @internal
- */
-class MethodCallAnalyzer extends CallAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\MethodCall $stmt,
- Context $context,
- bool $real_method_call = true
- ): bool {
- $was_inside_call = $context->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 cb91434..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php
+++ /dev/null
@@ -1,586 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssertionFinder;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\PossibleRawObjectIteration;
-use Psalm\Issue\RawObjectIteration;
-use Psalm\Issue\RedundantFunctionCall;
-use Psalm\Issue\RedundantFunctionCallGivenDocblockType;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Type;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosedResource;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TDependentGetDebugType;
-use Psalm\Type\Atomic\TDependentGetType;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function array_map;
-use function extension_loaded;
-use function implode;
-use function in_array;
-use function is_string;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class NamedFunctionCallHandler
-{
- /**
- * @param lowercase-string $function_id
- */
- public static function handle(
- StatementsAnalyzer $statements_analyzer,
- Codebase $codebase,
- PhpParser\Node\Expr\FuncCall $stmt,
- PhpParser\Node\Expr\FuncCall $real_stmt,
- PhpParser\Node\Name $function_name,
- ?string $function_id,
- Context $context
- ): void {
- if ($function_id === 'get_class'
- || $function_id === 'gettype'
- || $function_id === 'get_debug_type'
- ) {
- self::handleDependentTypeFunction(
- $statements_analyzer,
- $stmt,
- $real_stmt,
- $function_id,
- $context
- );
-
- return;
- }
-
- if ($stmt->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 863c38e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php
+++ /dev/null
@@ -1,866 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\MethodVisibilityAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Issue\AbstractInstantiation;
-use Psalm\Issue\DeprecatedClass;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\InterfaceInstantiation;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InternalMethod;
-use Psalm\Issue\InvalidStringClass;
-use Psalm\Issue\MixedMethodCall;
-use Psalm\Issue\TooManyArguments;
-use Psalm\Issue\UndefinedClass;
-use Psalm\Issue\UnsafeGenericInstantiation;
-use Psalm\Issue\UnsafeInstantiation;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TAnonymousClassInstance;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-
-use function array_map;
-use function array_merge;
-use function array_shift;
-use function array_values;
-use function implode;
-use function in_array;
-use function md5;
-use function preg_match;
-use function reset;
-use function strtolower;
-
-/**
- * @internal
- */
-class NewAnalyzer extends CallAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\New_ $stmt,
- Context $context
- ): bool {
- $fq_class_name = null;
-
- $codebase = $statements_analyzer->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 da43d41..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php
+++ /dev/null
@@ -1,382 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\NonStaticSelfCall;
-use Psalm\Issue\ParentNotFound;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function in_array;
-use function md5;
-use function strtolower;
-
-/**
- * @internal
- */
-class StaticCallAnalyzer extends CallAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\StaticCall $stmt,
- Context $context
- ): bool {
- $method_id = null;
-
- $lhs_type = null;
-
- $codebase = $statements_analyzer->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 673dc56..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php
+++ /dev/null
@@ -1,1136 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod;
-
-use Exception;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentMapPopulator;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\MethodVisibilityAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\AtomicPropertyFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DeprecatedClass;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InvalidStringClass;
-use Psalm\Issue\MixedMethodCall;
-use Psalm\Issue\UndefinedClass;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Node\VirtualArg;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_filter;
-use function array_map;
-use function assert;
-use function count;
-use function in_array;
-use function strtolower;
-
-class AtomicStaticCallAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\StaticCall $stmt,
- Context $context,
- Atomic $lhs_type_part,
- bool $ignore_nullable_issues,
- bool &$moved_call,
- bool &$has_mock,
- bool &$has_existing_method
- ): void {
- $intersection_types = [];
-
- if ($lhs_type_part instanceof TNamedObject) {
- $fq_class_name = $lhs_type_part->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<PhpParser\Node\Arg> $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 3785023..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php
+++ /dev/null
@@ -1,642 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\MethodCallProhibitionAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\AbstractMethodCall;
-use Psalm\Issue\ImpureMethodCall;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AfterMethodCallAnalysisEvent;
-use Psalm\Storage\Assertion;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-
-use function array_map;
-use function count;
-use function explode;
-use function in_array;
-use function is_string;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class ExistingAtomicStaticCallAnalyzer
-{
- /**
- * @param list<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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 9cc9d85..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php
+++ /dev/null
@@ -1,1171 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use PhpParser\Node\Identifier;
-use PhpParser\Node\Name;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileSource;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ArgumentTypeCoercion;
-use Psalm\Issue\InvalidArgument;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\InvalidScalarArgument;
-use Psalm\Issue\MixedArgumentTypeCoercion;
-use Psalm\Issue\UndefinedFunction;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\BinaryOp\VirtualIdentical;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\VirtualName;
-use Psalm\Storage\Assertion;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_unique;
-use function count;
-use function explode;
-use function implode;
-use function in_array;
-use function is_int;
-use function is_numeric;
-use function mt_rand;
-use function preg_match;
-use function preg_replace;
-use function spl_object_id;
-use function str_replace;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class CallAnalyzer
-{
- public static function collectSpecialInformation(
- FunctionLikeAnalyzer $source,
- string $method_name,
- Context $context
- ): void {
- $method_name_lc = strtolower($method_name);
- $fq_class_name = (string)$source->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<PhpParser\Node\Arg> $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<string, array<string, Union>>
- * @param array<string, non-empty-array<string, Union>> $existing_template_types
- * @param array<string, array<string, Union>> $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<string, array<string, Union>> $template_extended_params
- * @param array<string, array<string, Union>> $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<non-empty-string>
- *
- * @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<PhpParser\Node\Arg> $args
- * @param array<string, array<string, non-empty-list<TemplateBound>>> $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 439ee3b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php
+++ /dev/null
@@ -1,538 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\Method\MethodCallReturnTypeFetcher;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Issue\InvalidCast;
-use Psalm\Issue\PossiblyInvalidCast;
-use Psalm\Issue\RedundantCast;
-use Psalm\Issue\RedundantCastGivenDocblockType;
-use Psalm\Issue\UnrecognizedExpression;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function array_pop;
-use function array_values;
-use function count;
-use function get_class;
-
-class CastAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Cast $stmt,
- Context $context
- ): bool {
- if ($stmt instanceof PhpParser\Node\Expr\Cast\Int_) {
- if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->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 45ed9e9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Issue\InvalidClone;
-use Psalm\Issue\MixedClone;
-use Psalm\Issue\PossiblyInvalidClone;
-use Psalm\IssueBuffer;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TTemplateParam;
-
-use function array_merge;
-use function array_pop;
-
-class CloneAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Clone_ $stmt,
- Context $context
- ): bool {
- $codebase = $statements_analyzer->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 e874371..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\InvalidArgument;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-
-class EmptyAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Empty_ $stmt,
- Context $context
- ): void {
- IssetAnalyzer::analyzeIssetVar($statements_analyzer, $stmt->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 d90b9dc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use PhpParser\Node\Scalar\EncapsedStringPart;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Union;
-
-use function assert;
-use function in_array;
-
-class EncapsulatedStringAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Scalar\Encapsed $stmt,
- Context $context
- ): bool {
- $stmt_type = Type::getString();
-
- $non_empty = false;
-
- $all_literals = true;
-
- $literal_string = "";
-
- foreach ($stmt->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 c8df04d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type\TaintKind;
-
-use function in_array;
-
-/**
- * @internal
- */
-class EvalAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Eval_ $stmt,
- Context $context
- ): void {
- ExpressionAnalyzer::analyze($statements_analyzer, $stmt->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 308a5e7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser\Node\Expr\Exit_;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\ImpureFunctionCall;
-use Psalm\IssueBuffer;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\TaintKind;
-use Psalm\Type\Union;
-
-class ExitAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- Exit_ $stmt,
- Context $context
- ): bool {
- $expr_type = null;
-
- $config = $statements_analyzer->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 ed779f5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php
+++ /dev/null
@@ -1,224 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\Config;
-use Psalm\FileSource;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-
-use function count;
-use function implode;
-use function in_array;
-use function is_string;
-use function strtolower;
-
-class ExpressionIdentifier
-{
- public static function getVarId(
- PhpParser\Node\Expr $stmt,
- ?string $this_class_name,
- ?FileSource $source = null,
- ?int &$nesting = null
- ): ?string {
- if ($stmt instanceof PhpParser\Node\Expr\Variable && is_string($stmt->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 6dd4463..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php
+++ /dev/null
@@ -1,2060 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\EmptyArrayAccess;
-use Psalm\Issue\InvalidArrayAccess;
-use Psalm\Issue\InvalidArrayAssignment;
-use Psalm\Issue\InvalidArrayOffset;
-use Psalm\Issue\MixedArrayAccess;
-use Psalm\Issue\MixedArrayAssignment;
-use Psalm\Issue\MixedArrayOffset;
-use Psalm\Issue\MixedArrayTypeCoercion;
-use Psalm\Issue\MixedStringOffsetAssignment;
-use Psalm\Issue\NullArrayAccess;
-use Psalm\Issue\NullArrayOffset;
-use Psalm\Issue\PossiblyInvalidArrayAccess;
-use Psalm\Issue\PossiblyInvalidArrayAssignment;
-use Psalm\Issue\PossiblyInvalidArrayOffset;
-use Psalm\Issue\PossiblyNullArrayAccess;
-use Psalm\Issue\PossiblyNullArrayAssignment;
-use Psalm\Issue\PossiblyNullArrayOffset;
-use Psalm\Issue\PossiblyUndefinedArrayOffset;
-use Psalm\Issue\PossiblyUndefinedIntArrayOffset;
-use Psalm\Issue\PossiblyUndefinedStringArrayOffset;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Node\VirtualName;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TSingleLetter;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_keys;
-use function array_map;
-use function array_pop;
-use function array_values;
-use function count;
-use function implode;
-use function in_array;
-use function is_int;
-use function preg_match;
-use function strlen;
-use function strtolower;
-
-/**
- * @internal
- */
-class ArrayFetchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\ArrayDimFetch $stmt,
- Context $context
- ): bool {
- $array_var_id = ExpressionIdentifier::getArrayVarId(
- $stmt->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<string> $expected_offset_types
- * @param TArray|TKeyedArray|TList|TClassStringMap $type
- * @param list<array-key> $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<string> $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<string> $expected_offset_types
- * @param list<array-key> $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<string> $expected_offset_types
- * @param list<array-key> $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<string> $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 b34e983..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php
+++ /dev/null
@@ -1,1217 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use InvalidArgumentException;
-use PhpParser;
-use PhpParser\Node\Expr\PropertyFetch;
-use PhpParser\Node\Expr\StaticPropertyFetch;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\InstancePropertyAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DeprecatedProperty;
-use Psalm\Issue\ImpurePropertyFetch;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\InternalProperty;
-use Psalm\Issue\MissingPropertyType;
-use Psalm\Issue\NoInterfaceProperties;
-use Psalm\Issue\UndefinedClass;
-use Psalm\Issue\UndefinedDocblockClass;
-use Psalm\Issue\UndefinedMagicPropertyFetch;
-use Psalm\Issue\UndefinedPropertyFetch;
-use Psalm\Issue\UndefinedThisPropertyFetch;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_search;
-use function count;
-use function in_array;
-use function is_int;
-use function is_string;
-use function strtolower;
-
-/**
- * @internal
- */
-class AtomicPropertyFetchAnalyzer
-{
- /**
- * @param array<string> $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<Atomic> $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 8ed5643..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ClassConstFetchAnalyzer.php
+++ /dev/null
@@ -1,679 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Exception\CircularReferenceException;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Issue\CircularReference;
-use Psalm\Issue\DeprecatedClass;
-use Psalm\Issue\DeprecatedConstant;
-use Psalm\Issue\InaccessibleClassConstant;
-use Psalm\Issue\InternalClass;
-use Psalm\Issue\NonStaticSelfCall;
-use Psalm\Issue\ParentNotFound;
-use Psalm\Issue\UndefinedConstant;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function explode;
-use function in_array;
-use function strtolower;
-
-/**
- * @internal
- */
-class ClassConstFetchAnalyzer
-{
- /**
- * @psalm-suppress ComplexMethod to be refactored. We should probably regroup the two big if about $stmt->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 2d0d50e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Issue\UndefinedConstant;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function array_key_exists;
-use function array_pop;
-use function explode;
-use function implode;
-use function strtolower;
-
-/**
- * @internal
- */
-class ConstFetchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\ConstFetch $stmt,
- Context $context
- ): void {
- $const_name = implode('\\', $stmt->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 1e258a0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php
+++ /dev/null
@@ -1,482 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Issue\ImpurePropertyFetch;
-use Psalm\Issue\InvalidPropertyFetch;
-use Psalm\Issue\MixedPropertyFetch;
-use Psalm\Issue\NullPropertyFetch;
-use Psalm\Issue\PossiblyInvalidPropertyFetch;
-use Psalm\Issue\PossiblyNullPropertyFetch;
-use Psalm\Issue\UninitializedProperty;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParam;
-
-use function array_merge;
-use function array_shift;
-use function rtrim;
-use function strtolower;
-
-/**
- * @internal
- */
-class InstancePropertyFetchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\PropertyFetch $stmt,
- Context $context,
- bool $in_assignment = false,
- bool $is_static_access = false
- ): bool {
- $was_inside_general_use = $context->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 e28e3f0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php
+++ /dev/null
@@ -1,486 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ImpureStaticProperty;
-use Psalm\Issue\ParentNotFound;
-use Psalm\Issue\UndefinedPropertyAssignment;
-use Psalm\Issue\UndefinedPropertyFetch;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\VirtualPropertyFetch;
-use Psalm\Node\Expr\VirtualStaticPropertyFetch;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Type;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function count;
-use function explode;
-use function in_array;
-use function md5;
-use function strtolower;
-
-/**
- * @internal
- */
-class StaticPropertyFetchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\StaticPropertyFetch $stmt,
- Context $context
- ): bool {
- if (!$stmt->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 3ecde22..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php
+++ /dev/null
@@ -1,559 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression\Fetch;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Issue\ImpureVariable;
-use Psalm\Issue\InvalidScope;
-use Psalm\Issue\PossiblyUndefinedGlobalVariable;
-use Psalm\Issue\PossiblyUndefinedVariable;
-use Psalm\Issue\UndefinedGlobalVariable;
-use Psalm\Issue\UndefinedVariable;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\TaintKindGroup;
-use Psalm\Type\Union;
-
-use function in_array;
-use function is_string;
-
-/**
- * @internal
- */
-class VariableFetchAnalyzer
-{
- public const SUPER_GLOBALS = [
- '$GLOBALS',
- '$_SERVER',
- '$_GET',
- '$_POST',
- '$_FILES',
- '$_COOKIE',
- '$_SESSION',
- '$_REQUEST',
- '$_ENV',
- '$http_response_header',
- ];
-
- /**
- * @param bool $from_global - when used in a global keyword
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Variable $stmt,
- Context $context,
- bool $passed_by_reference = false,
- ?Union $by_ref_type = null,
- bool $array_assignment = false,
- bool $from_global = false
- ): bool {
- $project_analyzer = $statements_analyzer->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 38f9a9a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use PhpParser\Node\Expr\PostDec;
-use PhpParser\Node\Expr\PostInc;
-use PhpParser\Node\Expr\PreDec;
-use PhpParser\Node\Expr\PreInc;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ArithmeticOpAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Node\Expr\BinaryOp\VirtualMinus;
-use Psalm\Node\Expr\BinaryOp\VirtualPlus;
-use Psalm\Node\Expr\VirtualAssign;
-use Psalm\Node\Scalar\VirtualLNumber;
-use Psalm\Type;
-
-class IncDecExpressionAnalyzer
-{
- /**
- * @param PostInc|PostDec|PreInc|PreDec $stmt
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $stmt,
- Context $context
- ): bool {
- $was_inside_assignment = $context->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 9fd4f16..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php
+++ /dev/null
@@ -1,423 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Exception\FileIncludeException;
-use Psalm\Exception\UnpreparedAnalysisException;
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Issue\MissingFile;
-use Psalm\Issue\UnresolvableInclude;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Type\TaintKind;
-
-use function constant;
-use function defined;
-use function dirname;
-use function explode;
-use function file_exists;
-use function get_include_path;
-use function get_included_files;
-use function implode;
-use function in_array;
-use function is_string;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function realpath;
-use function str_repeat;
-use function str_replace;
-use function substr;
-
-use const DIRECTORY_SEPARATOR;
-use const PATH_SEPARATOR;
-use const PHP_EOL;
-
-/**
- * @internal
- */
-class IncludeAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Include_ $stmt,
- Context $context,
- ?Context $global_context = null
- ): bool {
- $codebase = $statements_analyzer->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('#(?<!phar):#', get_include_path())
- : explode(PATH_SEPARATOR, get_include_path());
-
- foreach ($paths as $prefix) {
- $ds = substr($prefix, -1) === DIRECTORY_SEPARATOR ? '' : DIRECTORY_SEPARATOR;
-
- if ($prefix === '.') {
- $prefix = $current_directory;
- }
-
- $file = $prefix . $ds . $file_name;
-
- if (file_exists($file)) {
- return $file;
- }
- }
-
- return null;
- }
-
- /**
- * @psalm-pure
- */
- public static function normalizeFilePath(string $path_to_file): string
- {
- // replace all \ with / for normalization
- $path_to_file = str_replace('\\', '/', $path_to_file);
- $path_to_file = str_replace('/./', '/', $path_to_file);
-
- // first remove unnecessary / duplicates
- $path_to_file = preg_replace('/\/[\/]+/', '/', $path_to_file);
-
- $reduce_pattern = '/\/[^\/]+\/\.\.\//';
-
- while (preg_match($reduce_pattern, $path_to_file)) {
- $path_to_file = preg_replace($reduce_pattern, '/', $path_to_file, 1);
- }
-
- if (DIRECTORY_SEPARATOR !== '/') {
- $path_to_file = str_replace('/', DIRECTORY_SEPARATOR, $path_to_file);
- }
-
- return $path_to_file;
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php
deleted file mode 100644
index e87bfe2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-
-use function implode;
-use function in_array;
-use function strtolower;
-
-class InstanceofAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Instanceof_ $stmt,
- Context $context
- ): bool {
- $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;
-
- 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 40f3381..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-
-class IssetAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Isset_ $stmt,
- Context $context
- ): void {
- foreach ($stmt->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 481a5af..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionAnalyzer;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Issue\UndefinedConstant;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Union;
-
-use function dirname;
-
-class MagicConstAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Scalar\MagicConst $stmt,
- Context $context
- ): void {
- if ($stmt instanceof PhpParser\Node\Scalar\MagicConst\Line) {
- $statements_analyzer->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 139fde0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Issue\UnhandledMatchCondition;
-use Psalm\IssueBuffer;
-use Psalm\Node\Expr\BinaryOp\VirtualIdentical;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Node\Expr\VirtualNew;
-use Psalm\Node\Expr\VirtualTernary;
-use Psalm\Node\Expr\VirtualThrow;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\VirtualArg;
-use Psalm\Type;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Reconciler;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_reverse;
-use function array_shift;
-use function count;
-use function in_array;
-use function spl_object_id;
-use function substr;
-
-class MatchAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Match_ $stmt,
- Context $context
- ): bool {
- $was_inside_call = $context->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<PhpParser\Node\Expr> $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 c1d4992..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Node\Expr\BinaryOp\VirtualIdentical;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Expr\VirtualPropertyFetch;
-use Psalm\Node\Expr\VirtualTernary;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\VirtualName;
-use Psalm\Type;
-
-/**
- * @internal
- */
-class NullsafeAnalyzer
-{
- /**
- * @param PhpParser\Node\Expr\NullsafePropertyFetch|PhpParser\Node\Expr\NullsafeMethodCall $stmt
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $stmt,
- Context $context
- ): bool {
- if (!$stmt->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 b65193a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\ImpureFunctionCall;
-use Psalm\IssueBuffer;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\TaintKind;
-
-class PrintAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Print_ $stmt,
- Context $context
- ): bool {
- $codebase = $statements_analyzer->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 081d0cf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php
+++ /dev/null
@@ -1,760 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\Codebase;
-use Psalm\Exception\CircularReferenceException;
-use Psalm\FileSource;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ArithmeticOpAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassConstantStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function array_merge;
-use function array_values;
-use function count;
-use function is_string;
-use function preg_match;
-use function strtolower;
-
-use const PHP_INT_MAX;
-
-/**
- * This class takes a statement and return its type by analyzing each part of the statement if necessary
- */
-class SimpleTypeInferer
-{
- /**
- * @param ?array<string, ClassConstantStorage> $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<string, ClassConstantStorage> $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<string, ClassConstantStorage> $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 872c734..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Exception\ScopeAnalysisException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\AlgebraAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Clause;
-use Psalm\Internal\Scope\IfScope;
-use Psalm\Internal\Type\AssertionReconciler;
-use Psalm\Type;
-use Psalm\Type\Reconciler;
-
-use function array_diff;
-use function array_filter;
-use function array_intersect;
-use function array_intersect_key;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function in_array;
-use function preg_match;
-use function preg_quote;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class TernaryAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Ternary $stmt,
- Context $context
- ): bool {
- $codebase = $statements_analyzer->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 1748544..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use PhpParser\Node\Expr\UnaryMinus;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-
-class UnaryPlusMinusAnalyzer
-{
- /**
- * @param PhpParser\Node\Expr\UnaryMinus|PhpParser\Node\Expr\UnaryPlus $stmt
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $stmt,
- Context $context
- ): bool {
- if (ExpressionAnalyzer::analyze($statements_analyzer, $stmt->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 d539c3e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php
+++ /dev/null
@@ -1,219 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Context;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\AtomicPropertyFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\UnnecessaryVarAnnotation;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-
-class YieldAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\Yield_ $stmt,
- Context $context
- ): bool {
- $doc_comment = $stmt->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 f9c03c4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements\Expression;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TKeyedArray;
-
-use function strtolower;
-
-class YieldFromAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr\YieldFrom $stmt,
- Context $context
- ): bool {
- $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;
- }
-
- 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 0ce2af8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php
+++ /dev/null
@@ -1,514 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClosureAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ArrayAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssertionFinder;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BitwiseNotAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\BooleanNotAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\NewAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CastAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CloneAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\EmptyAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\EncapsulatedStringAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\EvalAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExitAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ClassConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\InstancePropertyFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\StaticPropertyFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\IncDecExpressionAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\IncludeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\InstanceofAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\IssetAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\MagicConstAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\MatchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\NullsafeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\PrintAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\TernaryAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\UnaryPlusMinusAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\YieldAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\YieldFromAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Issue\ForbiddenCode;
-use Psalm\Issue\UnrecognizedExpression;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\AfterExpressionAnalysisEvent;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\TaintKind;
-
-use function get_class;
-use function in_array;
-use function strtolower;
-
-/**
- * @internal
- */
-class ExpressionAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Expr $stmt,
- Context $context,
- bool $array_assignment = false,
- ?Context $global_context = null,
- bool $from_stmt = false
- ): bool {
- $codebase = $statements_analyzer->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 c716bc2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\ReferenceConstraint;
-use Psalm\Issue\InvalidGlobal;
-use Psalm\IssueBuffer;
-
-use function is_string;
-
-class GlobalAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Global_ $stmt,
- Context $context,
- ?Context $global_context
- ): void {
- if (!$context->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 79832cc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php
+++ /dev/null
@@ -1,658 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\ClosureAnalyzer;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\ClassTemplateParamCollector;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\FalsableReturnStatement;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\InvalidReturnStatement;
-use Psalm\Issue\LessSpecificReturnStatement;
-use Psalm\Issue\MixedReturnStatement;
-use Psalm\Issue\MixedReturnTypeCoercion;
-use Psalm\Issue\NoValue;
-use Psalm\Issue\NullableReturnStatement;
-use Psalm\IssueBuffer;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function explode;
-use function reset;
-use function strtolower;
-
-/**
- * @internal
- */
-class ReturnAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Return_ $stmt,
- Context $context
- ): void {
- $doc_comment = $stmt->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 12d068d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Context;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\ReferenceConstraint;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\ImpureStaticVariable;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\MissingDocblockType;
-use Psalm\Issue\ReferenceConstraintViolation;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use UnexpectedValueException;
-
-use function is_string;
-
-class StaticAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Static_ $stmt,
- Context $context
- ): void {
- $codebase = $statements_analyzer->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 665a1c4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\InvalidThrow;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class ThrowAnalyzer
-{
- /**
- * @param PhpParser\Node\Stmt\Throw_|PhpParser\Node\Expr\Throw_ $stmt
- */
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node $stmt,
- Context $context
- ): bool {
- $context->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 c7cfeb6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Union;
-
-use function count;
-
-class UnsetAnalyzer
-{
- public static function analyze(
- StatementsAnalyzer $statements_analyzer,
- PhpParser\Node\Stmt\Unset_ $stmt,
- Context $context
- ): void {
- $context->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 30c01b4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer\Statements;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\PhpVisitor\CheckTrivialExprVisitor;
-
-use function array_key_exists;
-use function array_slice;
-use function count;
-use function is_array;
-use function is_string;
-use function strlen;
-use function substr;
-use function token_get_all;
-use function trim;
-
-class UnusedAssignmentRemover
-{
- /**
- * @var array<string, CodeLocation>
- */
- private $removed_unref_vars = [];
-
- /**
- * @param array<PhpParser\Node\Stmt> $stmts
- * @param array<string, CodeLocation> $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 = "<?php\n" . substr($stmt_content, $var_start_loc, $end_bound - $var_start_loc + 1);
- $token_list = array_slice(token_get_all($str_for_token), 1); //Ignore "<?php"
-
- $offset_count = strlen($token_list[0][1]);
- $iter = 1;
-
- // Check if second token is just whitespace
- if (is_array($token_list[$iter]) && trim($token_list[$iter][1]) === '') {
- $offset_count += strlen($token_list[1][1]);
- $iter++;
- }
-
- // Add offset for assignment operator
- if (is_string($token_list[$iter])) {
- $offset_count += 1;
- } else {
- $offset_count += strlen($token_list[$iter][1]);
- }
- $iter++;
-
- // Remove any whitespace following assignment operator token (e.g "=", "+=")
- if (is_array($token_list[$iter]) && trim($token_list[$iter][1]) === '') {
- $offset_count += strlen($token_list[$iter][1]);
- $iter++;
- }
-
- // If we are dealing with assignment by reference, we need to handle "&" and any whitespace after
- if ($assign_ref) {
- $offset_count += 1;
- $iter++;
- // Handle any whitespace after "&"
- if (is_array($token_list[$iter]) && trim($token_list[$iter][1]) === '') {
- $offset_count += strlen($token_list[$iter][1]);
- }
- }
-
- $file_man_start = $var_start_loc;
- $file_man_end = $var_start_loc + $offset_count;
-
- return new FileManipulation($file_man_start, $file_man_end, "", false);
- }
-
- /**
- * @param PhpParser\Node\Expr\Assign|PhpParser\Node\Expr\AssignOp|PhpParser\Node\Expr\AssignRef $cur_assign
- * @param array<string, CodeLocation> $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<string, CodeLocation> $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<PhpParser\Node\Stmt> $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 dff3d60..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php
+++ /dev/null
@@ -1,1076 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\Statements\Block\DoAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\ForAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\SwitchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\TryAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Block\WhileAnalyzer;
-use Psalm\Internal\Analyzer\Statements\BreakAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ContinueAnalyzer;
-use Psalm\Internal\Analyzer\Statements\EchoAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Assignment\InstancePropertyAssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ClassConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\Statements\GlobalAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ReturnAnalyzer;
-use Psalm\Internal\Analyzer\Statements\StaticAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ThrowAnalyzer;
-use Psalm\Internal\Analyzer\Statements\UnsetAnalyzer;
-use Psalm\Internal\Analyzer\Statements\UnusedAssignmentRemover;
-use Psalm\Internal\Codebase\DataFlowGraph;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\ReferenceConstraint;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Issue\ComplexFunction;
-use Psalm\Issue\ComplexMethod;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\MissingDocblockType;
-use Psalm\Issue\Trace;
-use Psalm\Issue\UndefinedDocblockClass;
-use Psalm\Issue\UndefinedTrace;
-use Psalm\Issue\UnevaluatedCode;
-use Psalm\Issue\UnrecognizedStatement;
-use Psalm\Issue\UnusedForeachValue;
-use Psalm\Issue\UnusedVariable;
-use Psalm\IssueBuffer;
-use Psalm\NodeTypeProvider;
-use Psalm\Plugin\EventHandler\Event\AfterStatementAnalysisEvent;
-use Psalm\Type;
-use UnexpectedValueException;
-
-use function array_change_key_case;
-use function array_column;
-use function array_combine;
-use function array_keys;
-use function array_merge;
-use function array_search;
-use function assert;
-use function count;
-use function fwrite;
-use function get_class;
-use function in_array;
-use function is_string;
-use function preg_split;
-use function reset;
-use function round;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function strtolower;
-use function substr;
-use function trim;
-
-use const PREG_SPLIT_NO_EMPTY;
-use const STDERR;
-
-/**
- * @internal
- */
-class StatementsAnalyzer extends SourceAnalyzer
-{
- /**
- * @var SourceAnalyzer
- */
- protected $source;
-
- /**
- * @var FileAnalyzer
- */
- protected $file_analyzer;
-
- /**
- * @var Codebase
- */
- protected $codebase;
-
- /**
- * @var array<string, CodeLocation>
- */
- private $all_vars = [];
-
- /**
- * @var array<string, int>
- */
- private $var_branch_points = [];
-
- /**
- * Possibly undefined variables should be initialised if we're altering code
- *
- * @var array<string, int>|null
- */
- private $vars_to_initialize;
-
- /**
- * @var array<string, FunctionAnalyzer>
- */
- private $function_analyzers = [];
-
- /**
- * @var array<string, array{0: string, 1: CodeLocation}>
- */
- private $unused_var_locations = [];
-
- /**
- * @var ?array<string, bool>
- */
- 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<string, list<CodeLocation>>
- * @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<PhpParser\Node\Stmt> $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<PhpParser\Node\Stmt> $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<PhpParser\Node\Stmt> $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<PhpParser\Node\Stmt> $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<string, array{0: string, 1: CodeLocation}>
- */
- 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<string, DataFlowNode>
- */
- 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<string, FunctionAnalyzer>
- */
- public function getFunctionAnalyzers(): array
- {
- return $this->function_analyzers;
- }
-
- /**
- * @param array<string, bool> $byref_uses
- */
- public function setByRefUses(array $byref_uses): void
- {
- $this->byref_uses = $byref_uses;
- }
-
- /**
- * @return array<string, array<array-key, CodeLocation>>
- */
- 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 1260c34..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TraitAnalyzer.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use PhpParser\Node\Stmt\Trait_;
-use Psalm\Aliases;
-use Psalm\Context;
-
-use function assert;
-
-/**
- * @internal
- */
-class TraitAnalyzer extends ClassLikeAnalyzer
-{
- /**
- * @var Aliases
- */
- private $aliases;
-
- public function __construct(
- Trait_ $class,
- SourceAnalyzer $source,
- string $fq_class_name,
- Aliases $aliases
- ) {
- $this->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<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array
- {
- return [];
- }
-
- /**
- * @return array<string, string>
- */
- 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 2a8451c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/TypeAnalyzer.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Analyzer;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_merge;
-use function array_unique;
-
-/**
- * @internal
- */
-class TypeAnalyzer
-{
- /**
- * Does the input param type match the given param type
- *
- * @deprecated in favour of UnionTypeComparator, going to be removed in Psalm 5
- * @psalm-suppress PossiblyUnusedMethod
- */
- public static function isContainedBy(
- Codebase $codebase,
- Union $input_type,
- Union $container_type,
- bool $ignore_null = false,
- bool $ignore_false = false,
- ?TypeComparisonResult $union_comparison_result = null,
- bool $allow_interface_equality = false
- ): bool {
- return UnionTypeComparator::isContainedBy(
- $codebase,
- $input_type,
- $container_type,
- $ignore_null,
- $ignore_false,
- $union_comparison_result,
- $allow_interface_equality
- );
- }
-
- /**
- * Does the input param atomic type match the given param atomic type
- *
- * @deprecated in favour of AtomicTypeComparator, going to be removed in Psalm 5
- * @psalm-suppress PossiblyUnusedMethod
- */
- public static function isAtomicContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality = false,
- bool $allow_float_int_equality = true,
- ?TypeComparisonResult $atomic_comparison_result = null
- ): bool {
- return AtomicTypeComparator::isContainedBy(
- $codebase,
- $input_type_part,
- $container_type_part,
- $allow_interface_equality,
- $allow_float_int_equality,
- $atomic_comparison_result
- );
- }
-
- /**
- * Takes two arrays of types and merges them
- *
- * @param array<string, Union> $new_types
- * @param array<string, Union> $existing_types
- *
- * @return array<string, Union>
- */
- 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 7996923..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Clause.php
+++ /dev/null
@@ -1,295 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Psalm\Internal\Algebra;
-
-use function array_diff;
-use function array_keys;
-use function array_map;
-use function array_unique;
-use function array_values;
-use function count;
-use function hash;
-use function implode;
-use function ksort;
-use function reset;
-use function serialize;
-use function sort;
-use function strpos;
-use function substr;
-
-use const PHP_VERSION_ID;
-
-/**
- * @internal
- *
- * @psalm-immutable
- */
-class Clause
-{
- /** @var int */
- public $creating_conditional_id;
-
- /** @var int */
- public $creating_object_id;
-
- /**
- * An array of strings of the form
- * [
- * '$a' => ['falsy'],
- * '$b' => ['!falsy'],
- * '$c' => ['!null'],
- * '$d' => ['string', 'int']
- * ]
- *
- * representing the formula
- *
- * !$a || $b || $c !== null || is_string($d) || is_int($d)
- *
- * @var array<string, non-empty-list<string>>
- */
- 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<string, non-empty-list<string>>|null
- */
- public $impossibilities;
-
- /** @var bool */
- public $wedge;
-
- /** @var bool */
- public $reconcilable;
-
- /** @var bool */
- public $generated = false;
-
- /** @var array<string, bool> */
- public $redefined_vars = [];
-
- /** @var string|int */
- public $hash;
-
- /**
- * @param array<string, non-empty-list<string>> $possibilities
- * @param array<string, bool> $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<string> $values
- */
- function (string $var_id, array $values): string {
- if ($var_id[0] === '*') {
- $var_id = '<expr>';
- }
-
- $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<string> $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 e8689ee..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/LanguageServer.php
+++ /dev/null
@@ -1,323 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Cli;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\CliUtils;
-use Psalm\Internal\Composer;
-use Psalm\Internal\ErrorHandler;
-use Psalm\Internal\Fork\PsalmRestarter;
-use Psalm\Internal\IncludeCollector;
-use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileReferenceCacheProvider;
-use Psalm\Internal\Provider\FileStorageCacheProvider;
-use Psalm\Internal\Provider\ParserCacheProvider;
-use Psalm\Internal\Provider\ProjectCacheProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\Report;
-
-use function array_key_exists;
-use function array_map;
-use function array_search;
-use function array_slice;
-use function chdir;
-use function error_log;
-use function fwrite;
-use function gc_disable;
-use function getcwd;
-use function getopt;
-use function implode;
-use function in_array;
-use function ini_set;
-use function is_array;
-use function is_string;
-use function preg_replace;
-use function realpath;
-use function setlocale;
-use function strpos;
-use function strtolower;
-use function substr;
-
-use const DIRECTORY_SEPARATOR;
-use const LC_CTYPE;
-use const PHP_EOL;
-use const STDERR;
-
-// phpcs:disable PSR1.Files.SideEffects
-
-require_once __DIR__ . '/../ErrorHandler.php';
-require_once __DIR__ . '/../CliUtils.php';
-require_once __DIR__ . '/../Composer.php';
-require_once __DIR__ . '/../IncludeCollector.php';
-
-final class LanguageServer
-{
- /** @param array<int,string> $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 <<<HELP
-Usage:
- psalm-language-server [options]
-
-Options:
- -h, --help
- Display this help message
-
- -v, --version
- Display the Psalm version
-
- -c, --config=psalm.xml
- Path to a psalm.xml configuration file. Run psalm --init to create one.
-
- -r, --root
- If running Psalm globally you'll need to specify a project root. Defaults to cwd
-
- --find-dead-code
- Look for dead code
-
- --clear-cache
- Clears all cache files that the language server uses for this specific project
-
- --use-ini-defaults
- Use PHP-provided ini defaults for memory and error display
-
- --tcp=url
- Use TCP mode (by default Psalm uses STDIO)
-
- --tcp-server
- Use TCP in server mode (default is client)
-
- --disable-on-change[=line-number-threshold]
- If added, the language server will not respond to onChange events.
- You can also specify a line count over which Psalm will not run on-change events.
-
- --enable-autocomplete[=BOOL]
- Enables or disables autocomplete on methods and properties. Default is true.
-
- --use-extended-diagnostic-codes
- Enables sending help uri links with the code in diagnostic messages.
-
- --verbose
- Will send log messages to the client with information.
-
-HELP;
-
- exit;
- }
-
- if (getcwd() === false) {
- fwrite(STDERR, 'Cannot get current working directory' . PHP_EOL);
- exit(1);
- }
-
- if (isset($options['root'])) {
- $options['r'] = $options['root'];
- }
-
- $current_dir = (string)getcwd() . 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;
- }
-
- $vendor_dir = CliUtils::getVendorDir($current_dir);
-
- $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);
- }
- );
-
- 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 5a89185..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Plugin.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Cli;
-
-use PackageVersions\Versions;
-use Psalm\Internal\CliUtils;
-use Psalm\Internal\PluginManager\Command\DisableCommand;
-use Psalm\Internal\PluginManager\Command\EnableCommand;
-use Psalm\Internal\PluginManager\Command\ShowCommand;
-use Psalm\Internal\PluginManager\PluginListFactory;
-use Symfony\Component\Console\Application;
-
-use function dirname;
-use function getcwd;
-
-use const DIRECTORY_SEPARATOR;
-
-// phpcs:disable PSR1.Files.SideEffects
-
-require_once __DIR__ . '/../CliUtils.php';
-require_once __DIR__ . '/../Composer.php';
-
-final class Plugin
-{
- public static function run(): void
- {
- $current_dir = (string)getcwd() . DIRECTORY_SEPARATOR;
- $vendor_dir = CliUtils::getVendorDir($current_dir);
- CliUtils::requireAutoloaders($current_dir, false, $vendor_dir);
-
- $app = new Application('psalm-plugin', Versions::getVersion('vimeo/psalm'));
-
- $psalm_root = dirname(__DIR__, 4) . DIRECTORY_SEPARATOR;
-
- $plugin_list_factory = new PluginListFactory($current_dir, $psalm_root);
-
- $app->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 86031b7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php
+++ /dev/null
@@ -1,1176 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Cli;
-
-use Composer\Autoload\ClassLoader;
-use Psalm\Config;
-use Psalm\Config\Creator;
-use Psalm\ErrorBaseline;
-use Psalm\Exception\ConfigCreationException;
-use Psalm\Exception\ConfigException;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\CliUtils;
-use Psalm\Internal\Codebase\ReferenceMapGenerator;
-use Psalm\Internal\Composer;
-use Psalm\Internal\ErrorHandler;
-use Psalm\Internal\Fork\Pool;
-use Psalm\Internal\Fork\PsalmRestarter;
-use Psalm\Internal\IncludeCollector;
-use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileReferenceCacheProvider;
-use Psalm\Internal\Provider\FileStorageCacheProvider;
-use Psalm\Internal\Provider\ParserCacheProvider;
-use Psalm\Internal\Provider\ProjectCacheProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\Internal\Stubs\Generator\StubsGenerator;
-use Psalm\IssueBuffer;
-use Psalm\Progress\DebugProgress;
-use Psalm\Progress\DefaultProgress;
-use Psalm\Progress\LongProgress;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Psalm\Report;
-use Psalm\Report\ReportOptions;
-use RuntimeException;
-use Webmozart\PathUtil\Path;
-
-use function array_filter;
-use function array_key_exists;
-use function array_map;
-use function array_merge;
-use function array_slice;
-use function array_sum;
-use function array_values;
-use function chdir;
-use function count;
-use function file_exists;
-use function file_put_contents;
-use function fwrite;
-use function gc_collect_cycles;
-use function gc_disable;
-use function getcwd;
-use function getenv;
-use function getopt;
-use function implode;
-use function in_array;
-use function ini_get;
-use function ini_set;
-use function is_array;
-use function is_numeric;
-use function is_scalar;
-use function is_string;
-use function json_encode;
-use function max;
-use function microtime;
-use function preg_match;
-use function preg_replace;
-use function realpath;
-use function setlocale;
-use function str_repeat;
-use function strpos;
-use function substr;
-use function version_compare;
-
-use const DIRECTORY_SEPARATOR;
-use const LC_CTYPE;
-use const PHP_EOL;
-use const PHP_OS;
-use const PHP_VERSION;
-use const STDERR;
-
-// phpcs:disable PSR1.Files.SideEffects
-
-require_once __DIR__ . '/../ErrorHandler.php';
-require_once __DIR__ . '/../CliUtils.php';
-require_once __DIR__ . '/../Composer.php';
-require_once __DIR__ . '/../IncludeCollector.php';
-require_once __DIR__ . '/../../IssueBuffer.php';
-
-final class Psalm
-{
- private const SHORT_OPTIONS = [
- 'f:',
- 'm',
- 'h',
- 'v',
- 'c:',
- 'i',
- 'r:',
- ];
-
- private const LONG_OPTIONS = [
- 'clear-cache',
- 'clear-global-cache',
- 'config:',
- 'debug',
- 'debug-by-line',
- 'debug-performance',
- 'debug-emitted-issues',
- 'diff',
- 'disable-extension:',
- 'find-dead-code::',
- 'find-unused-code::',
- 'find-unused-variables',
- 'find-references-to:',
- 'help',
- 'ignore-baseline',
- 'init',
- 'memory-limit:',
- 'monochrome',
- 'no-diff',
- 'no-cache',
- 'no-reflection-cache',
- 'no-file-cache',
- 'output-format:',
- 'plugin:',
- 'report:',
- 'report-show-info:',
- 'root:',
- 'set-baseline:',
- 'show-info:',
- 'show-snippet:',
- 'stats',
- 'threads:',
- 'update-baseline',
- 'use-baseline:',
- 'use-ini-defaults',
- 'version',
- 'php-version:',
- 'generate-json-map:',
- 'generate-stubs:',
- 'alter',
- 'language-server',
- 'refactor',
- 'shepherd::',
- 'no-progress',
- 'long-progress',
- 'no-suggestions',
- 'include-php-versions', // used for baseline
- 'pretty-print', // used for JSON reports
- 'track-tainted-input',
- 'taint-analysis',
- 'security-analysis',
- 'dump-taint-graph:',
- 'find-unused-psalm-suppress',
- 'error-level:',
- ];
-
- /**
- * @param array<int,string> $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>|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<int,string> $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<string,string|false|list<mixed>> $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<int, string> $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<string,array<string,array{o:int, s: list<string>}>>
- */
- 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<string,array<string,array{o:int, s: list<string>}>>
- */
- 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, false|list<mixed>|string> $options
- * @param-out array<string, false|list<mixed>|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<int, string> $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<string,array<string,array{o:int, s: list<string>}>>
- */
- 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 a294914..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalter.php
+++ /dev/null
@@ -1,578 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Cli;
-
-use Composer\XdebugHandler\XdebugHandler;
-use Psalm\Config;
-use Psalm\Exception\UnsupportedIssueToFixException;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\CliUtils;
-use Psalm\Internal\Composer;
-use Psalm\Internal\ErrorHandler;
-use Psalm\Internal\IncludeCollector;
-use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileStorageCacheProvider;
-use Psalm\Internal\Provider\ParserCacheProvider;
-use Psalm\Internal\Provider\ProjectCacheProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\IssueBuffer;
-use Psalm\Progress\DebugProgress;
-use Psalm\Progress\DefaultProgress;
-use Psalm\Report;
-use Psalm\Report\ReportOptions;
-
-use function array_filter;
-use function array_key_exists;
-use function array_map;
-use function array_merge;
-use function array_shift;
-use function array_slice;
-use function chdir;
-use function count;
-use function explode;
-use function file_exists;
-use function file_get_contents;
-use function filter_var;
-use function fwrite;
-use function gc_collect_cycles;
-use function gc_disable;
-use function getcwd;
-use function getopt;
-use function implode;
-use function in_array;
-use function ini_set;
-use function is_array;
-use function is_dir;
-use function is_string;
-use function microtime;
-use function pathinfo;
-use function preg_replace;
-use function preg_split;
-use function realpath;
-use function strpos;
-use function strtolower;
-use function substr;
-use function trim;
-
-use const DIRECTORY_SEPARATOR;
-use const FILTER_NULL_ON_FAILURE;
-use const FILTER_VALIDATE_BOOLEAN;
-use const PATHINFO_EXTENSION;
-use const PHP_EOL;
-use const STDERR;
-
-// phpcs:disable PSR1.Files.SideEffects
-
-require_once __DIR__ . '/../ErrorHandler.php';
-require_once __DIR__ . '/../CliUtils.php';
-require_once __DIR__ . '/../Composer.php';
-require_once __DIR__ . '/../IncludeCollector.php';
-require_once __DIR__ . '/../../IssueBuffer.php';
-
-final class Psalter
-{
- private const SHORT_OPTIONS = ['f:', 'm', 'h', 'r:', 'c:'];
-
- private const LONG_OPTIONS = [
- 'help', 'debug', 'debug-by-line', 'debug-emitted-issues', 'config:', 'file:', 'root:',
- 'plugin:', 'issues:', 'list-supported-issues', 'php-version:', 'dry-run', 'safe-types',
- 'find-unused-code', 'threads:', 'codeowner:',
- 'allow-backwards-incompatible-changes:',
- 'add-newline-between-docblock-annotations:',
- 'no-cache'
- ];
-
- /** @param array<int,string> $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 <<<HELP
-Usage:
- psalter [options] [file...]
-
-Options:
- -h, --help
- Display this help message
-
- --debug, --debug-by-line, --debug-emitted-issues
- Debug information
-
- -c, --config=psalm.xml
- Path to a psalm.xml configuration file. Run psalm --init to create one.
-
- -m, --monochrome
- Enable monochrome output
-
- -r, --root
- If running Psalm globally you'll need to specify a project root. Defaults to cwd
-
- --plugin=PATH
- Executes a plugin, an alternative to using the Psalm config
-
- --dry-run
- Shows a diff of all the changes, without making them
-
- --safe-types
- Only update PHP types when the new type information comes from other PHP types,
- as opposed to type information that just comes from docblocks
-
- --php-version=PHP_MAJOR_VERSION.PHP_MINOR_VERSION
-
- --issues=IssueType1,IssueType2
- If any issues can be fixed automatically, Psalm will update the codebase. To fix as many issues as possible,
- use --issues=all
-
- --list-supported-issues
- Display the list of issues that psalter knows how to fix
-
- --find-unused-code
- Include unused code as a candidate for removal
-
- --threads=INT
- If greater than one, Psalm will run analysis on multiple threads, speeding things up.
-
- --codeowner=[codeowner]
- You can specify a GitHub code ownership group, and only that owner's code will be updated.
-
- --allow-backwards-incompatible-changes=BOOL
- Allow Psalm modify method signatures that could break code outside the project. Defaults to true.
-
- --add-newline-between-docblock-annotations=BOOL
- Whether to add or not add a new line between docblock annotations. Defaults to true.
-
- --no-cache
- Runs Psalm without using cache
-
-HELP;
-
- exit;
- }
-
- if (!isset($options['issues']) &&
- !isset($options['list-supported-issues']) &&
- (!isset($options['plugin']) || $options['plugin'] === false)
- ) {
- fwrite(
- STDERR,
- 'Please specify the issues you want to fix with --issues=IssueOne,IssueTwo or --issues=all, '
- . 'or provide a plugin that has its own manipulations with --plugin=path/to/plugin.php'
- . PHP_EOL
- );
- exit(1);
- }
-
- $current_dir = (string)getcwd() . DIRECTORY_SEPARATOR;
-
- if (isset($options['r']) && is_string($options['r'])) {
- $root_path = realpath($options['r']);
-
- if (!$root_path) {
- die('Could not locate root directory ' . $current_dir . DIRECTORY_SEPARATOR . $options['r'] . PHP_EOL);
- }
-
- $current_dir = $root_path . DIRECTORY_SEPARATOR;
- }
-
- $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);
- }
- );
-
-
- // 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<int,string> $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, false|list<mixed>|string> $options
- * @param-out array<string, false|list<mixed>|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<string, array<int, string>> */
- 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<string, array<int, string>> $codeowner_files
- * @return list<string>
- */
- 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 1c87f4e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Refactor.php
+++ /dev/null
@@ -1,330 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Cli;
-
-use Composer\XdebugHandler\XdebugHandler;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\CliUtils;
-use Psalm\Internal\Composer;
-use Psalm\Internal\ErrorHandler;
-use Psalm\Internal\IncludeCollector;
-use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileStorageCacheProvider;
-use Psalm\Internal\Provider\ParserCacheProvider;
-use Psalm\Internal\Provider\ProjectCacheProvider;
-use Psalm\Internal\Provider\Providers;
-use Psalm\IssueBuffer;
-use Psalm\Progress\DebugProgress;
-use Psalm\Progress\DefaultProgress;
-use Psalm\Report;
-use Psalm\Report\ReportOptions;
-
-use function array_key_exists;
-use function array_map;
-use function array_slice;
-use function chdir;
-use function end;
-use function explode;
-use function fwrite;
-use function gc_collect_cycles;
-use function gc_disable;
-use function getcwd;
-use function getopt;
-use function implode;
-use function in_array;
-use function ini_set;
-use function is_array;
-use function is_string;
-use function max;
-use function microtime;
-use function preg_replace;
-use function preg_split;
-use function realpath;
-use function strpos;
-use function substr;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_EOL;
-use const STDERR;
-
-// phpcs:disable PSR1.Files.SideEffects
-
-require_once __DIR__ . '/../ErrorHandler.php';
-require_once __DIR__ . '/../CliUtils.php';
-require_once __DIR__ . '/../Composer.php';
-require_once __DIR__ . '/../IncludeCollector.php';
-require_once __DIR__ . '/../../IssueBuffer.php';
-
-final class Refactor
-{
- /** @param array<int,string> $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 <<<HELP
-Usage:
- psalm-refactor [options] [symbol1] into [symbol2]
-
-Options:
- -h, --help
- Display this help message
-
- --debug, --debug-by-line, --debug-emitted-issues
- Debug information
-
- -c, --config=psalm.xml
- Path to a psalm.xml configuration file. Run psalm --init to create one.
-
- -r, --root
- If running Psalm globally you'll need to specify a project root. Defaults to cwd
-
- --threads=auto
- If greater than one, Psalm will run analysis on multiple threads, speeding things up.
- By default
-
- --move "[Identifier]" --into "[Class]"
- Moves the specified item into the class. More than one item can be moved into a class
- by passing a comma-separated list of values e.g.
-
- --move "Ns\Foo::bar,Ns\Foo::baz" --into "Biz\Bang\DestinationClass"
-
- --rename "[Identifier]" --to "[NewIdentifier]"
- Renames a specified item (e.g. method) and updates all references to it that Psalm can
- identify.
-
-HELP;
-
- exit;
- }
-
- if (isset($options['root'])) {
- $options['r'] = $options['root'];
- }
-
- $current_dir = (string)getcwd() . DIRECTORY_SEPARATOR;
-
- if (isset($options['r']) && is_string($options['r'])) {
- $root_path = realpath($options['r']);
-
- if (!$root_path) {
- die('Could not locate root directory ' . $current_dir . DIRECTORY_SEPARATOR . $options['r'] . PHP_EOL);
- }
-
- $current_dir = $root_path . DIRECTORY_SEPARATOR;
- }
-
- $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);
- }
- );
-
- // 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 f8c8873..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/CliUtils.php
+++ /dev/null
@@ -1,665 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Composer\Autoload\ClassLoader;
-use PackageVersions\Versions;
-use Phar;
-use Psalm\Config;
-use Psalm\Config\Creator;
-use Psalm\Exception\ConfigException;
-use Psalm\Exception\ConfigNotFoundException;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Composer;
-use Psalm\Report;
-
-use function array_slice;
-use function assert;
-use function count;
-use function define;
-use function dirname;
-use function fgets;
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function fwrite;
-use function implode;
-use function in_array;
-use function ini_get;
-use function is_array;
-use function is_dir;
-use function is_string;
-use function json_decode;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function realpath;
-use function stream_get_meta_data;
-use function stream_set_blocking;
-use function strlen;
-use function strpos;
-use function strtoupper;
-use function substr;
-use function substr_replace;
-use function trim;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_EOL;
-use const STDERR;
-use const STDIN;
-
-final class CliUtils
-{
- public static function requireAutoloaders(
- string $current_dir,
- bool $has_explicit_root,
- string $vendor_dir
- ): ?ClassLoader {
- $autoload_roots = [$current_dir];
-
- $psalm_dir = dirname(__DIR__, 3);
-
- $in_phar = Phar::running() || strpos(__NAMESPACE__, 'HumbugBox');
-
- if ($in_phar) {
- $stringable_path = __DIR__ . '/../../../vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php';
- if (file_exists($stringable_path)) {
- require_once $stringable_path;
- }
- require_once __DIR__ . '/../../../vendor/autoload.php';
-
- // hack required for JsonMapper
- require_once __DIR__ . '/../../../vendor/netresearch/jsonmapper/src/JsonMapper.php';
- require_once __DIR__ . '/../../../vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php';
- }
-
- if (!$in_phar && realpath($psalm_dir) !== realpath($current_dir)) {
- $autoload_roots[] = $psalm_dir;
- }
-
- $autoload_files = [];
-
- foreach ($autoload_roots as $autoload_root) {
- $has_autoloader = false;
-
- $nested_autoload_file = dirname($autoload_root, 2). DIRECTORY_SEPARATOR . 'autoload.php';
-
- // note: don't realpath $nested_autoload_file, or phar version will fail
- if (file_exists($nested_autoload_file)) {
- if (!in_array($nested_autoload_file, $autoload_files, false)) {
- $autoload_files[] = $nested_autoload_file;
- }
- $has_autoloader = true;
- }
-
- $vendor_autoload_file =
- $autoload_root . DIRECTORY_SEPARATOR . $vendor_dir . DIRECTORY_SEPARATOR . 'autoload.php';
-
- // note: don't realpath $vendor_autoload_file, or phar version will fail
- if (file_exists($vendor_autoload_file)) {
- if (!in_array($vendor_autoload_file, $autoload_files, false)) {
- $autoload_files[] = $vendor_autoload_file;
- }
- $has_autoloader = true;
- }
-
- $composer_json_file = Composer::getJsonFilePath($autoload_root);
- if (!$has_autoloader && file_exists($composer_json_file)) {
- $error_message = 'Could not find any composer autoloaders in ' . $autoload_root;
-
- if (!$has_explicit_root) {
- $error_message .= PHP_EOL . 'Add a --root=[your/project/directory] flag '
- . 'to specify a particular project to run Psalm on.';
- }
-
- fwrite(STDERR, $error_message . PHP_EOL);
- exit(1);
- }
- }
-
- $first_autoloader = null;
-
- foreach ($autoload_files as $file) {
- /**
- * @psalm-suppress UnresolvableInclude
- *
- * @var mixed
- */
- $autoloader = require_once $file;
-
- if (!$first_autoloader
- && $autoloader instanceof ClassLoader
- ) {
- $first_autoloader = $autoloader;
- }
- }
-
- if ($first_autoloader === null && !$in_phar) {
- if (!$autoload_files) {
- fwrite(STDERR, 'Failed to find a valid Composer autoloader' . "\n");
- } else {
- fwrite(
- STDERR,
- 'Failed to find a valid Composer autoloader in ' . implode(', ', $autoload_files) . "\n"
- );
- }
-
- fwrite(
- STDERR,
- 'Please make sure you’ve run `composer install` in the current directory before using Psalm.' . "\n"
- );
- exit(1);
- }
-
- define('PSALM_VERSION', Versions::getVersion('vimeo/psalm'));
- define('PHP_PARSER_VERSION', Versions::getVersion('nikic/php-parser'));
-
- return $first_autoloader;
- }
-
- /**
- * @psalm-suppress MixedAssignment
- */
- public static function getVendorDir(string $current_dir): string
- {
- $composer_json_path = Composer::getJsonFilePath($current_dir);
-
- if (!file_exists($composer_json_path)) {
- return 'vendor';
- }
-
- if (!$composer_json = json_decode(file_get_contents($composer_json_path), true)) {
- fwrite(
- STDERR,
- 'Invalid composer.json at ' . $composer_json_path . "\n"
- );
- exit(1);
- }
-
- if (is_array($composer_json)
- && isset($composer_json['config'])
- && is_array($composer_json['config'])
- && isset($composer_json['config']['vendor-dir'])
- && is_string($composer_json['config']['vendor-dir'])
- ) {
- return $composer_json['config']['vendor-dir'];
- }
-
- return 'vendor';
- }
-
- /**
- * @return list<string>
- */
- public static function getRawCliArguments(): array
- {
- global $argv;
-
- if (!$argv) {
- return [];
- }
-
- return array_slice($argv, 1);
- }
-
- /**
- * @return list<string>
- */
- 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<string>|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 <<<HELP
-Usage:
- psalm [options] [file...]
-
-Basic configuration:
- -c, --config=psalm.xml
- Path to a psalm.xml configuration file. Run psalm --init to create one.
-
- --use-ini-defaults
- Use PHP-provided ini defaults for memory and error display
-
- --memory-limit=LIMIT
- Use a specific memory limit. Cannot be combined with --use-ini-defaults
-
- --disable-extension=[extension]
- Used to disable certain extensions while Psalm is running.
-
- --threads=INT
- If greater than one, Psalm will run analysis on multiple threads, speeding things up.
-
- --no-diff
- Turns off Psalm’s diff mode, checks all files regardless of whether they’ve changed.
-
- --php-version=PHP_VERSION
- Explicitly set PHP version to analyse code against.
-
-Surfacing issues:
- --show-info[=BOOLEAN]
- Show non-exception parser findings (defaults to false).
-
- --show-snippet[=true]
- Show code snippets with errors. Options are 'true' or 'false'
-
- --find-dead-code[=auto]
- --find-unused-code[=auto]
- Look for unused code. Options are 'auto' or 'always'. If no value is specified, default is 'auto'
-
- --find-unused-psalm-suppress
- Finds all @psalm-suppress annotations that aren’t used
-
- --find-references-to=[class|method|property]
- Searches the codebase for references to the given fully-qualified class or method,
- where method is in the format class::methodName
-
- --no-suggestions
- Hide suggestions
-
- --taint-analysis
- Run Psalm in taint analysis mode – see https://psalm.dev/docs/security_analysis for more info
-
- --dump-taint-graph=OUTPUT_PATH
- Output the taint graph using the DOT language – requires --taint-analysis
-
-Issue baselines:
- --set-baseline=PATH
- Save all current error level issues to a file, to mark them as info in subsequent runs
-
- Add --include-php-versions to also include a list of PHP extension versions
-
- --use-baseline=PATH
- Allows you to use a baseline other than the default baseline provided in your config
-
- --ignore-baseline
- Ignore the error baseline
-
- --update-baseline
- Update the baseline by removing fixed issues. This will not add new issues to the baseline
-
- Add --include-php-versions to also include a list of PHP extension versions
-
-Plugins:
- --plugin=PATH
- Executes a plugin, an alternative to using the Psalm config
-
-Output:
- -m, --monochrome
- Enable monochrome output
-
- --output-format=console
- Changes the output format.
- Available formats: compact, console, text, emacs, json, pylint, xml, checkstyle, junit, sonarqube, github,
- phpstorm, codeclimate
-
- --no-progress
- Disable the progress indicator
-
- --long-progress
- Use a progress indicator suitable for Continuous Integration logs
-
- --stats
- Shows a breakdown of Psalm’s ability to infer types in the codebase
-
-Reports:
- --report=PATH
- The path where to output report file. The output format is based on the file extension.
- (Currently supported formats: ".json", ".xml", ".txt", ".emacs", ".pylint", ".console",
- ".sarif", "checkstyle.xml", "sonarqube.json", "codeclimate.json", "summary.json", "junit.xml")
-
- --report-show-info[=BOOLEAN]
- Whether the report should include non-errors in its output (defaults to true)
-
-Caching:
- --clear-cache
- Clears all cache files that Psalm uses for this specific project
-
- --clear-global-cache
- Clears all cache files that Psalm uses for all projects
-
- --no-cache
- Runs Psalm without using cache
-
- --no-reflection-cache
- Runs Psalm without using cached representations of unchanged classes and files.
- Useful if you want the afterClassLikeVisit plugin hook to run every time you visit a file.
-
- --no-file-cache
- Runs Psalm without using caching every single file for later diffing.
- This reduces the space Psalm uses on disk and file I/O.
-
-Miscellaneous:
- -h, --help
- Display this help message
-
- -v, --version
- Display the Psalm version
-
- -i, --init [source_dir=src] [level=3]
- Create a psalm config file in the current directory that points to [source_dir]
- at the required level, from 1, most strict, to 8, most permissive.
-
- --debug
- Debug information
-
- --debug-by-line
- Debug information on a line-by-line level
-
- --debug-emitted-issues
- Print a php backtrace to stderr when emitting issues.
-
- -r, --root
- If running Psalm globally you’ll need to specify a project root. Defaults to cwd
-
- --generate-json-map=PATH
- Generate a map of node references and types in JSON format, saved to the given path.
-
- --generate-stubs=PATH
- Generate stubs for the project and dump the file in the given path
-
- --shepherd[=host]
- Send data to Shepherd, Psalm’s GitHub integration tool.
-
- --alter
- Run Psalter
-
- --language-server
- Run Psalm Language Server
-
-HELP;
- }
-
- public static function initializeConfig(
- ?string $path_to_config,
- string $current_dir,
- string $output_format,
- ?ClassLoader $first_autoloader,
- bool $create_if_non_existent = false
- ): Config {
- try {
- if ($path_to_config) {
- $config = Config::loadFromXMLFile($path_to_config, $current_dir);
- } else {
- try {
- $config = Config::getConfigForPath($current_dir, $current_dir);
- } catch (ConfigNotFoundException $e) {
- if (!$create_if_non_existent) {
- if (in_array($output_format, [Report::TYPE_CONSOLE, Report::TYPE_PHP_STORM])) {
- fwrite(
- STDERR,
- 'Could not locate a config XML file in path ' . $current_dir
- . '. Have you run \'psalm --init\' ?' . PHP_EOL
- );
- exit(1);
- }
-
- throw $e;
- }
-
- $config = Creator::createBareConfig(
- $current_dir,
- null,
- self::getVendorDir($current_dir)
- );
- }
- }
- } catch (ConfigException $e) {
- fwrite(
- STDERR,
- $e->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, '<psalm'));
-
- if (!$end_psalm_open_tag) {
- fwrite(STDERR, " Don't forget to set errorBaseline=\"{$baseline_path}\" in your config.");
- return;
- }
-
- if ($config_file_contents[$end_psalm_open_tag - 1] === "\n") {
- $amended_config_file_contents = substr_replace(
- $config_file_contents,
- " errorBaseline=\"{$baseline_path}\"\n>",
- $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 36c9271..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php
+++ /dev/null
@@ -1,1644 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\FileManipulation\ClassDocblockManipulator;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\FileManipulation\FunctionDocblockManipulator;
-use Psalm\Internal\FileManipulation\PropertyDocblockManipulator;
-use Psalm\Internal\Fork\Pool;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\IssueBuffer;
-use Psalm\Progress\Progress;
-use Psalm\Type;
-use Psalm\Type\Union;
-use SebastianBergmann\Diff\Differ;
-use SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_intersect_key;
-use function array_merge;
-use function array_values;
-use function count;
-use function explode;
-use function implode;
-use function intdiv;
-use function ksort;
-use function number_format;
-use function pathinfo;
-use function preg_replace;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function usort;
-
-use const PATHINFO_EXTENSION;
-use const PHP_INT_MAX;
-
-/**
- * @psalm-type TaggedCodeType = array<int, array{0: int, 1: non-empty-string}>
- *
- * @psalm-type FileMapType = array{
- * 0: TaggedCodeType,
- * 1: TaggedCodeType,
- * 2: array<int, array{0: int, 1: non-empty-string, 2: int}>
- * }
- *
- * @psalm-type WorkerData = array{
- * issues: array<string, list<IssueData>>,
- * fixable_issue_counts: array<string, int>,
- * nonmethod_references_to_classes: array<string, array<string,bool>>,
- * method_references_to_classes: array<string, array<string,bool>>,
- * file_references_to_class_members: array<string, array<string,bool>>,
- * file_references_to_class_properties: array<string, array<string,bool>>,
- * file_references_to_method_returns: array<string, array<string,bool>>,
- * file_references_to_missing_class_members: array<string, array<string,bool>>,
- * mixed_counts: array<string, array{0: int, 1: int}>,
- * mixed_member_names: array<string, array<string, bool>>,
- * function_timings: array<string, float>,
- * file_manipulations: array<string, FileManipulation[]>,
- * method_references_to_class_members: array<string, array<string,bool>>,
- * method_dependencies: array<string, array<string,bool>>,
- * method_references_to_method_returns: array<string, array<string,bool>>,
- * method_references_to_class_properties: array<string, array<string,bool>>,
- * method_references_to_missing_class_members: array<string, array<string,bool>>,
- * method_param_uses: array<string, array<int, array<string, bool>>>,
- * analyzed_methods: array<string, array<string, int>>,
- * file_maps: array<string, FileMapType>,
- * class_locations: array<string, array<int, CodeLocation>>,
- * class_method_locations: array<string, array<int, CodeLocation>>,
- * class_property_locations: array<string, array<int, CodeLocation>>,
- * possible_method_param_types: array<string, array<int, Union>>,
- * taint_data: ?TaintFlowGraph,
- * unused_suppressions: array<string, array<int, int>>,
- * used_suppressions: array<string, array<int, bool>>,
- * function_docblock_manipulators: array<string, array<int, FunctionDocblockManipulator>>,
- * mutable_classes: array<string, bool>,
- * }
- */
-
-/**
- * @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<string, array{0: int, 1: int}>
- */
- private $mixed_counts = [];
-
- /**
- * Used to store member names of mixed property/method access
- *
- * @var array<string, array<string, bool>>
- */
- private $mixed_member_names = [];
-
- /**
- * @var bool
- */
- private $count_mixed = true;
-
- /**
- * Used to store debug performance data
- *
- * @var array<string, float>
- */
- private $function_timings = [];
-
- /**
- * We analyze more files than we necessarily report errors in
- *
- * @var array<string, string>
- */
- private $files_to_analyze = [];
-
- /**
- * We can show analysis results on more files than we analyze
- * because the results can be cached
- *
- * @var array<string, string>
- */
- private $files_with_analysis_results = [];
-
- /**
- * We may update fewer files than we analyse (i.e. for dead code detection)
- *
- * @var array<string>|null
- */
- private $files_to_update;
-
- /**
- * @var array<string, array<string, int>>
- */
- private $analyzed_methods = [];
-
- /**
- * @var array<string, array<int, IssueData>>
- */
- private $existing_issues = [];
-
- /**
- * @var array<string, array<int, array{0: int, 1: non-empty-string}>>
- */
- private $reference_map = [];
-
- /**
- * @var array<string, array<int, array{0: int, 1: non-empty-string}>>
- */
- private $type_map = [];
-
- /**
- * @var array<string, array<int, array{0: int, 1: non-empty-string, 2: int}>>
- */
- private $argument_map = [];
-
- /**
- * @var array<string, array<int, Union>>
- */
- public $possible_method_param_types = [];
-
- /**
- * @var array<string, bool>
- */
- 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<string, string> $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<string, string> $files_to_analyze
- *
- */
- public function addFilesToShowResults(array $files_to_analyze): void
- {
- $this->files_with_analysis_results += $files_to_analyze;
- }
-
- /**
- * @param array<string> $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<string, class-string<FileAnalyzer>> $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<IssueData>
- */
- 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<IssueData> $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<int, WorkerData>
- */
- $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<string, array<int, array{int, int, int, int}>> $diff_map
- * @param array<string, array<int, array{int, int}>> $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<string, array<string, bool>>
- */
- 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<string, array<string, bool>> $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<string, array{0: int, 1: int}>
- */
- 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<string, float>
- */
- 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<IssueData>
- */
- 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<string, array<string, int>>
- */
- public function getAnalyzedMethods(): array
- {
- return $this->analyzed_methods;
- }
-
- /**
- * @return array<string, FileMapType>
- */
- 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<string, array<int, Union>>
- */
- 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 d386344..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\Codebase;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TMixed;
-
-use function array_merge;
-use function array_values;
-use function preg_match;
-use function sprintf;
-use function str_replace;
-
-/**
- * @internal
- */
-final class ClassConstantByWildcardResolver
-{
- /**
- * @var Codebase
- */
- private $codebase;
-
- public function __construct(Codebase $codebase)
- {
- $this->codebase = $codebase;
- }
-
- /**
- * @return list<Atomic>|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 372d1da..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php
+++ /dev/null
@@ -1,2331 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use InvalidArgumentException;
-use PhpParser;
-use PhpParser\NodeTraverser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Exception\UnpopulatedClasslikeException;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\ConstantTypeResolver;
-use Psalm\Internal\FileManipulation\ClassDocblockManipulator;
-use Psalm\Internal\FileManipulation\CodeMigration;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\PhpVisitor\TraitFinder;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\StatementsProvider;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\PossiblyUnusedMethod;
-use Psalm\Issue\PossiblyUnusedParam;
-use Psalm\Issue\PossiblyUnusedProperty;
-use Psalm\Issue\PossiblyUnusedReturnValue;
-use Psalm\Issue\UnusedClass;
-use Psalm\Issue\UnusedConstructor;
-use Psalm\Issue\UnusedMethod;
-use Psalm\Issue\UnusedParam;
-use Psalm\Issue\UnusedProperty;
-use Psalm\Issue\UnusedReturnValue;
-use Psalm\IssueBuffer;
-use Psalm\Node\VirtualNode;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassConstantStorage;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Union;
-use ReflectionClass;
-use ReflectionProperty;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_merge;
-use function array_pop;
-use function count;
-use function end;
-use function explode;
-use function get_declared_classes;
-use function get_declared_interfaces;
-use function implode;
-use function preg_match;
-use function preg_quote;
-use function preg_replace;
-use function strlen;
-use function strrpos;
-use function strtolower;
-use function substr;
-
-use const PHP_EOL;
-
-/**
- * @internal
- *
- * Handles information about classes, interfaces and traits
- */
-class ClassLikes
-{
- /**
- * @var ClassLikeStorageProvider
- */
- private $classlike_storage_provider;
-
- /**
- * @var FileReferenceProvider
- */
- public $file_reference_provider;
-
- /**
- * @var array<lowercase-string, bool>
- */
- private $existing_classlikes_lc = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- private $existing_classes_lc = [];
-
- /**
- * @var array<string, bool>
- */
- private $existing_classes = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- private $existing_interfaces_lc = [];
-
- /**
- * @var array<string, bool>
- */
- private $existing_interfaces = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- private $existing_traits_lc = [];
-
- /**
- * @var array<string, bool>
- */
- private $existing_traits = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- private $existing_enums_lc = [];
-
- /**
- * @var array<string, bool>
- */
- private $existing_enums = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- private $classlike_aliases = [];
-
- /**
- * @var array<string, PhpParser\Node\Stmt\Trait_>
- */
- 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<int, string> */
- $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<int, string> */
- $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<string>
- */
- 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<lowercase-string, string> 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<string, ClassConstantStorage>
- */
- 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<lowercase-string, bool>,
- * array<lowercase-string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<string, bool>,
- * }
- */
- 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<lowercase-string, bool>,
- * 1: array<lowercase-string, bool>,
- * 2: array<lowercase-string, bool>,
- * 3: array<string, bool>,
- * 4: array<lowercase-string, bool>,
- * 5: array<string, bool>,
- * 6: array<lowercase-string, bool>,
- * 7: array<string, bool>,
- * 8: array<string, bool>,
- * } $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 c73e67a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ConstantTypeResolver.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\Exception\CircularReferenceException;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArrayOffsetFetch;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArraySpread;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArrayValue;
-use Psalm\Internal\Scanner\UnresolvedConstant\ClassConstant;
-use Psalm\Internal\Scanner\UnresolvedConstant\Constant;
-use Psalm\Internal\Scanner\UnresolvedConstant\ScalarValue;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedAdditionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBinaryOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseAnd;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseOr;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseXor;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedConcatOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedDivisionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedMultiplicationOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedSubtractionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedTernary;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function ctype_digit;
-use function is_float;
-use function is_int;
-use function is_string;
-use function spl_object_id;
-
-/**
- * @internal
- */
-class ConstantTypeResolver
-{
- public static function resolve(
- ClassLikes $classlikes,
- UnresolvedConstantComponent $c,
- StatementsAnalyzer $statements_analyzer = null,
- array $visited_constant_ids = []
- ): Atomic {
- $c_id = spl_object_id($c);
-
- if (isset($visited_constant_ids[$c_id])) {
- throw new CircularReferenceException('Found a circular reference');
- }
-
- if ($c instanceof ScalarValue) {
- return self::getLiteralTypeFromScalarValue($c->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 988a814..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/DataFlowGraph.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\Path;
-
-use function abs;
-use function array_keys;
-use function array_merge;
-use function array_reverse;
-use function array_sum;
-use function count;
-use function strlen;
-use function strpos;
-use function substr;
-
-abstract class DataFlowGraph
-{
- /** @var array<string, array<string, Path>> */
- protected $forward_edges = [];
-
- abstract public function addNode(DataFlowNode $node): void;
-
- /**
- * @param array<string> $added_taints
- * @param array<string> $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<string> $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<list<string>>
- */
- 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 ca882a0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Functions.php
+++ /dev/null
@@ -1,603 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Exception;
-use PhpParser\Node\Arg;
-use PhpParser\Node\Expr\Closure as ClosureNode;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Internal\Provider\FunctionExistenceProvider;
-use Psalm\Internal\Provider\FunctionParamsProvider;
-use Psalm\Internal\Provider\FunctionReturnTypeProvider;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\NodeTypeProvider;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Type\Atomic\TNamedObject;
-use UnexpectedValueException;
-
-use function array_shift;
-use function count;
-use function end;
-use function explode;
-use function implode;
-use function in_array;
-use function is_bool;
-use function rtrim;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class Functions
-{
- /**
- * @var FileStorageProvider
- */
- private $file_storage_provider;
-
- /**
- * @var array<lowercase-string, FunctionStorage>
- */
- 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<string, FunctionStorage>
- */
- 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<lowercase-string,FunctionStorage>
- */
- 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<lowercase-string, FunctionStorage> */
- $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<Arg> $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 8af4d0c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php
+++ /dev/null
@@ -1,437 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use PhpParser;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\NodeTypeProvider;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\TaintKind;
-use UnexpectedValueException;
-
-use function array_shift;
-use function assert;
-use function count;
-use function dirname;
-use function file_exists;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function version_compare;
-
-/**
- * @internal
- *
- * Gets values from the call map array, which stores data about native functions and methods
- */
-class InternalCallMapHandler
-{
- private const PHP_MAJOR_VERSION = 8;
- private const PHP_MINOR_VERSION = 1;
- private const LOWEST_AVAILABLE_DELTA = 71;
-
- /**
- * @var ?int
- */
- private static $loaded_php_major_version;
- /**
- * @var ?int
- */
- private static $loaded_php_minor_version;
-
- /**
- * @var array<lowercase-string, array<int|string,string>>|null
- */
- private static $call_map;
-
- /**
- * @var array<list<TCallable>>|null
- */
- private static $call_map_callables = [];
-
- /**
- * @var array<string, list<list<TaintKind::*>>>
- */
- private static $taint_sink_map = [];
-
- /**
- * @param list<PhpParser\Node\Arg> $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<int, TCallable> $callables
- * @param list<PhpParser\Node\Arg> $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<TCallable>|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<string, array<int|string, string>>
- */
- 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<string, array<int|string, string>> */
- $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<string, list<list<TaintKind::*>>>
- */
- $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<string, array<int|string, string>>,
- * changed: array<string, array{
- * old: array<int|string, string>,
- * new: array<int|string, string>
- * }>,
- * removed: array<string, array<int|string, string>>
- * }
- */
- $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 6324b77..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Methods.php
+++ /dev/null
@@ -1,1255 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use InvalidArgumentException;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\SourceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\MethodExistenceProvider;
-use Psalm\Internal\Provider\MethodParamsProvider;
-use Psalm\Internal\Provider\MethodReturnTypeProvider;
-use Psalm\Internal\Provider\MethodVisibilityProvider;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_pop;
-use function array_values;
-use function assert;
-use function count;
-use function explode;
-use function in_array;
-use function is_int;
-use function reset;
-use function strtolower;
-
-/**
- * @internal
- *
- * Handles information about class methods
- */
-class Methods
-{
- /**
- * @var ClassLikeStorageProvider
- */
- private $classlike_storage_provider;
-
- /**
- * @var bool
- */
- public $collect_locations = false;
-
- /**
- * @var FileReferenceProvider
- */
- public $file_reference_provider;
-
- /**
- * @var ClassLikes
- */
- private $classlikes;
-
- /** @var MethodReturnTypeProvider */
- public $return_type_provider;
-
- /** @var MethodParamsProvider */
- public $params_provider;
-
- /** @var MethodExistenceProvider */
- public $existence_provider;
-
- /** @var MethodVisibilityProvider */
- public $visibility_provider;
-
- public function __construct(
- ClassLikeStorageProvider $storage_provider,
- FileReferenceProvider $file_reference_provider,
- ClassLikes $classlikes
- ) {
- $this->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<PhpParser\Node\Arg> $args
- *
- * @return list<FunctionLikeParameter>
- */
- 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<string, array<string, Union>> $extends
- * @return list<Atomic>
- */
- 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<PhpParser\Node\Arg>|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<string, MethodIdentifier>
- */
- 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 9d83282..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Populator.php
+++ /dev/null
@@ -1,1224 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use InvalidArgumentException;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Issue\CircularReference;
-use Psalm\IssueBuffer;
-use Psalm\Progress\Progress;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_filter;
-use function array_intersect_key;
-use function array_keys;
-use function array_merge;
-use function count;
-use function in_array;
-use function reset;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- *
- * Populates file and class information so that analysis can work properly
- */
-class Populator
-{
- /**
- * @var ClassLikeStorageProvider
- */
- private $classlike_storage_provider;
-
- /**
- * @var FileStorageProvider
- */
- private $file_storage_provider;
-
- /**
- * @var array<lowercase-string, list<ClassLikeStorage>>
- */
- 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<string, bool> $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 2a0137a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Properties.php
+++ /dev/null
@@ -1,356 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\PropertyExistenceProvider;
-use Psalm\Internal\Provider\PropertyTypeProvider;
-use Psalm\Internal\Provider\PropertyVisibilityProvider;
-use Psalm\StatementsSource;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function explode;
-use function preg_replace;
-use function strtolower;
-
-/**
- * @internal
- *
- * Handles information about class properties
- */
-class Properties
-{
- /**
- * @var ClassLikeStorageProvider
- */
- private $classlike_storage_provider;
-
- /** @var ClassLikes */
- private $classlikes;
-
- /**
- * @var bool
- */
- public $collect_locations = false;
-
- /**
- * @var FileReferenceProvider
- */
- public $file_reference_provider;
-
- /**
- * @var PropertyExistenceProvider
- */
- public $property_existence_provider;
-
- /**
- * @var PropertyTypeProvider
- */
- public $property_type_provider;
-
- /**
- * @var PropertyVisibilityProvider
- */
- public $property_visibility_provider;
-
-
- public function __construct(
- ClassLikeStorageProvider $storage_provider,
- FileReferenceProvider $file_reference_provider,
- ClassLikes $classlikes
- ) {
- $this->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 2b0029a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/PropertyMap.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use function dirname;
-use function strtolower;
-
-/**
- * @internal
- */
-class PropertyMap
-{
- /**
- * @var array<lowercase-string, array<string, string>>|null
- */
- private static $property_map;
-
- /**
- * Gets the method/function call map
- *
- * @return array<lowercase-string, array<string, string>>
- */
- public static function getPropertyMap(): array
- {
- if (self::$property_map !== null) {
- return self::$property_map;
- }
-
- /** @var array<string, array<string, string>> */
- $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 80a6ad2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-
-class ReferenceMapGenerator
-{
- /**
- * @return array<string, string>
- */
- 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 8a50103..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Reflection.php
+++ /dev/null
@@ -1,548 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Exception;
-use LogicException;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Storage\ClassConstantStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type;
-use Psalm\Type\Union;
-use ReflectionClass;
-use ReflectionException;
-use ReflectionFunction;
-use ReflectionMethod;
-use ReflectionNamedType;
-use ReflectionParameter;
-use ReflectionType;
-use ReflectionUnionType;
-use UnexpectedValueException;
-
-use function array_map;
-use function array_merge;
-use function get_class;
-use function implode;
-use function strtolower;
-
-/**
- * @internal
- *
- * Handles information gleaned from class and function reflection
- */
-class Reflection
-{
- /**
- * @var ClassLikeStorageProvider
- */
- private $storage_provider;
-
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * @var array<string, FunctionStorage>
- */
- 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<string, int|string|float|null|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<string, FunctionStorage>
- */
- 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 fb6e1bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php
+++ /dev/null
@@ -1,811 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\ErrorHandler;
-use Psalm\Internal\Fork\Pool;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\IssueBuffer;
-use Psalm\Progress\Progress;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Type;
-use ReflectionClass;
-use Throwable;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_merge;
-use function array_pop;
-use function ceil;
-use function count;
-use function error_reporting;
-use function explode;
-use function file_exists;
-use function min;
-use function realpath;
-use function strtolower;
-use function substr;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_EOL;
-
-/**
- * @psalm-type ThreadData = array{
- * array<string, string>,
- * array<string, string>,
- * array<string, string>,
- * array<string, bool>,
- * array<string, bool>,
- * array<string, string>,
- * array<string, bool>,
- * array<string, bool>,
- * array<string, bool>
- * }
- *
- * @psalm-type PoolData = array{
- * classlikes_data:array{
- * array<lowercase-string, bool>,
- * array<lowercase-string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<lowercase-string, bool>,
- * array<string, bool>,
- * array<string, bool>
- * },
- * scanner_data: ThreadData,
- * issues:array<string, list<IssueData>>,
- * changed_members:array<string, array<string, bool>>,
- * unchanged_signature_members:array<string, array<string, bool>>,
- * diff_map:array<string, array<int, array{int, int, int, int}>>,
- * deletion_ranges:array<string, array<int, array{int, int}>>,
- * errors:array<string, bool>,
- * classlike_storage:array<string, ClassLikeStorage>,
- * file_storage:array<lowercase-string, FileStorage>,
- * new_file_content_hashes: array<string, string>,
- * taint_data: ?TaintFlowGraph
- * }
- */
-
-/**
- * @internal
- *
- * Contains methods that aid in the scanning of Psalm's codebase
- */
-class Scanner
-{
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * @var array<string, string>
- */
- private $classlike_files = [];
-
- /**
- * @var array<string, bool>
- */
- private $deep_scanned_classlike_files = [];
-
- /**
- * @var array<string, string>
- */
- private $files_to_scan = [];
-
- /**
- * @var array<string, string>
- */
- private $classes_to_scan = [];
-
- /**
- * @var array<string, bool>
- */
- private $classes_to_deep_scan = [];
-
- /**
- * @var array<string, string>
- */
- private $files_to_deep_scan = [];
-
- /**
- * @var array<string, bool>
- */
- private $scanned_files = [];
-
- /**
- * @var array<string, bool>
- */
- private $store_scan_failure = [];
-
- /**
- * @var array<string, bool>
- */
- 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<string, string> $files_to_scan
- *
- */
- public function addFilesToShallowScan(array $files_to_scan): void
- {
- $this->files_to_scan += $files_to_scan;
- }
-
- /**
- * @param array<string, string> $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<string, mixed> $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<int, PoolData>
- */
- $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<string, class-string<FileScanner>> $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<string, class-string<FileScanner>> $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<string, bool>
- */
- 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 2812bb6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/TaintFlowGraph.php
+++ /dev/null
@@ -1,524 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\CodeLocation;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\TaintSink;
-use Psalm\Internal\DataFlow\TaintSource;
-use Psalm\Issue\TaintedCallable;
-use Psalm\Issue\TaintedCookie;
-use Psalm\Issue\TaintedCustom;
-use Psalm\Issue\TaintedEval;
-use Psalm\Issue\TaintedFile;
-use Psalm\Issue\TaintedHeader;
-use Psalm\Issue\TaintedHtml;
-use Psalm\Issue\TaintedInclude;
-use Psalm\Issue\TaintedLdap;
-use Psalm\Issue\TaintedSSRF;
-use Psalm\Issue\TaintedShell;
-use Psalm\Issue\TaintedSql;
-use Psalm\Issue\TaintedSystemSecret;
-use Psalm\Issue\TaintedTextWithQuotes;
-use Psalm\Issue\TaintedUnserialize;
-use Psalm\Issue\TaintedUserSecret;
-use Psalm\IssueBuffer;
-use Psalm\Type\TaintKind;
-
-use function array_diff;
-use function array_filter;
-use function array_intersect;
-use function array_merge;
-use function array_unique;
-use function count;
-use function end;
-use function implode;
-use function json_encode;
-use function ksort;
-use function sort;
-use function strlen;
-use function substr;
-
-class TaintFlowGraph extends DataFlowGraph
-{
- /** @var array<string, TaintSource> */
- private $sources = [];
-
- /** @var array<string, DataFlowNode> */
- private $nodes = [];
-
- /** @var array<string, TaintSink> */
- private $sinks = [];
-
- /** @var array<string, array<string, true>> */
- private $specialized_calls = [];
-
- /** @var array<string, array<string, true>> */
- 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<array{location: ?CodeLocation, label: string, entry_path_type: string}>
- */
- 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<string> $source_taints
- * @param array<DataFlowNode> $sinks
- * @return array<string, DataFlowNode>
- */
- 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<int, DataFlowNode> */
- 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 f0bca35..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/VariableUseGraph.php
+++ /dev/null
@@ -1,224 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Codebase;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\DataFlow\Path;
-
-use function abs;
-use function array_merge;
-use function count;
-
-class VariableUseGraph extends DataFlowGraph
-{
- /** @var array<string, array<string, true>> */
- protected $backward_edges = [];
-
- /** @var array<string, DataFlowNode> */
- private $nodes = [];
-
- /** @var array<string, list<CodeLocation>> */
- private $origin_locations_by_id = [];
-
- public function addNode(DataFlowNode $node): void
- {
- $this->nodes[$node->id] = $node;
- }
-
- /**
- * @param array<string> $added_taints
- * @param array<string> $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<CodeLocation>
- */
- 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<string, bool> $visited_source_ids
- * @return array<string, DataFlowNode>|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<string, bool> $visited_source_ids
- * @return list<DataFlowNode>
- */
- 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 52ac935..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Composer.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use function basename;
-use function getenv;
-use function pathinfo;
-use function substr;
-use function trim;
-
-use const PATHINFO_EXTENSION;
-
-/**
- * @internal
- */
-final class Composer
-{
- /**
- * Retrieve the path to composer.json file.
- *
- * @see https://github.com/composer/composer/blob/5df1797d20c6ab1eb606dc0f0d76a16ba57ddb7f/src/Composer/Factory.php#L233
- */
- public static function getJsonFilePath(string $root): string
- {
- $file_name = getenv('COMPOSER') ?: 'composer.json';
- $file_name = basename(trim($file_name));
-
- return $root . '/' . $file_name;
- }
-
- /**
- * Retrieve the path to composer.lock file.
- *
- * @see https://github.com/composer/composer/blob/5df1797d20c6ab1eb606dc0f0d76a16ba57ddb7f/src/Composer/Factory.php#L238
- */
- public static function getLockFilePath(string $root): string
- {
- $composer_json_path = self::getJsonFilePath($root);
- return "json" === pathinfo($composer_json_path, PATHINFO_EXTENSION)
- ? substr($composer_json_path, 0, -4).'lock'
- : $composer_json_path . '.lock';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php
deleted file mode 100644
index 39f4564..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/DataFlowNode.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-namespace Psalm\Internal\DataFlow;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-/**
- * @psalm-consistent-constructor
- */
-class DataFlowNode
-{
- /** @var string */
- public $id;
-
- /** @var ?string */
- public $unspecialized_id;
-
- /** @var string */
- public $label;
-
- /** @var ?CodeLocation */
- public $code_location;
-
- /** @var ?string */
- public $specialization_key;
-
- /** @var array<string> */
- public $taints;
-
- /** @var ?self */
- public $previous;
-
- /** @var list<string> */
- public $path_types = [];
-
- /**
- * @var array<string, array<string, true>>
- */
- public $specialized_calls = [];
-
- /**
- * @param array<string> $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 05d120b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/Path.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Psalm\Internal\DataFlow;
-
-/**
- * @psalm-immutable
- */
-class Path
-{
- public $type;
-
- public $unescaped_taints;
-
- public $escaped_taints;
-
- public $length;
-
- /**
- * @param ?array<string> $unescaped_taints
- * @param ?array<string> $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 408f13c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSink.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Internal\DataFlow;
-
-class TaintSink extends DataFlowNode
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php b/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php
deleted file mode 100644
index c3b9acc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/DataFlow/TaintSource.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Internal\DataFlow;
-
-class TaintSource extends DataFlowNode
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php b/vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php
deleted file mode 100644
index b058845..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/AstDiffer.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Diff;
-
-use Closure;
-use Exception;
-use PhpParser\Node\Stmt;
-
-use function array_reverse;
-use function count;
-
-/**
- * Borrows from https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/Internal/Differ.php
- *
- * Implements the Myers diff algorithm.
- *
- * Myers, Eugene W. "An O (ND) difference algorithm and its variations."
- * Algorithmica 1.1 (1986): 251-266.
- *
- * @internal
- */
-class AstDiffer
-{
- /**
- * @param Closure(Stmt, Stmt, string, string, bool=): bool $is_equal
- * @param array<int, Stmt> $a
- * @param array<int, Stmt> $b
- *
- * @return array{0:non-empty-list<array<int, int>>, 1: int, 2: int, 3: array<int, bool>}
- */
- 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<int, array<int, int>> $trace
- * @param array<int, Stmt> $a
- * @param array<int, Stmt> $b
- * @param array<int, bool> $bc
- *
- * @return list<DiffElem>
- *
- * @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 fab907d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/ClassStatementsDiffer.php
+++ /dev/null
@@ -1,251 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Diff;
-
-use PhpParser;
-
-use function count;
-use function get_class;
-use function strpos;
-use function strtolower;
-use function substr;
-use function trim;
-
-/**
- * @internal
- */
-class ClassStatementsDiffer extends AstDiffer
-{
- /**
- * Calculate diff (edit script) from $a to $b.
- *
- * @param array<int, PhpParser\Node\Stmt> $a
- * @param array<int, PhpParser\Node\Stmt> $b
- *
- * @return array{
- * 0: list<string>,
- * 1: list<string>,
- * 2: list<string>,
- * 3: array<int, array{int, int, int, int}>,
- * 4: list<array{int, int}>
- * }
- */
- 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<PhpParser\Comment> */
- $a_comments = $a->getComments();
- /** @var list<PhpParser\Comment> */
- $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<int, array{int, int, int, int}> $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 d8ac0d2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/DiffElem.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Diff;
-
-/**
- * @internal
- *
- * @psalm-immutable
- */
-class DiffElem
-{
- public const TYPE_KEEP = 0;
- public const TYPE_REMOVE = 1;
- public const TYPE_ADD = 2;
- public const TYPE_REPLACE = 3;
- public const TYPE_KEEP_SIGNATURE = 4;
-
- /** @var int One of the TYPE_* constants */
- public $type;
- /** @var mixed Is null for add operations */
- public $old;
- /** @var mixed Is null for remove operations */
- public $new;
-
- /**
- * @param mixed $old
- * @param mixed $new
- */
- public function __construct(int $type, $old, $new)
- {
- $this->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 c50d446..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileDiffer.php
+++ /dev/null
@@ -1,319 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Diff;
-
-use Exception;
-
-use function array_reverse;
-use function count;
-use function explode;
-use function min;
-use function strlen;
-use function substr;
-
-/**
- * Borrows from https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/Internal/Differ.php
- *
- * Implements the Myers diff algorithm.
- *
- * Myers, Eugene W. "An O (ND) difference algorithm and its variations."
- * Algorithmica 1.1 (1986): 251-266.
- *
- * @internal
- */
-class FileDiffer
-{
- /**
- * @param list<string> $a
- * @param list<string> $b
- *
- * @return array{0:non-empty-list<array<int, int>>, 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<array<int, int>> $trace
- * @param list<string> $a
- * @param list<string> $b
- *
- * @return list<DiffElem>
- *
- * @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<int, array{0: int, 1: int, 2: int, 3: int, 4: int, 5: string}>
- *
- * @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<DiffElem>
- *
- * @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 9580d7f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/FileStatementsDiffer.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Diff;
-
-use PhpParser;
-
-use function array_merge;
-use function end;
-use function get_class;
-use function substr;
-
-/**
- * @internal
- */
-class FileStatementsDiffer extends AstDiffer
-{
- /**
- * Calculate diff (edit script) from $a to $b.
- * @param list<PhpParser\Node\Stmt> $a
- * @param list<PhpParser\Node\Stmt> $b
- *
- * @return array{
- * 0: list<string>,
- * 1: list<string>,
- * 2: list<string>,
- * 3: list<array{int, int, int, int}>,
- * 4: list<array{int, int}>
- * }
- */
- 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 5ac1e8a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Diff;
-
-use PhpParser;
-
-use function array_merge;
-use function end;
-use function get_class;
-use function substr;
-
-/**
- * @internal
- */
-class NamespaceStatementsDiffer extends AstDiffer
-{
- /**
- * Calculate diff (edit script) from $a to $b.
- * @param array<int, PhpParser\Node\Stmt> $a
- * @param array<int, PhpParser\Node\Stmt> $b
- *
- * @return array{
- * 0: list<string>,
- * 1: list<string>,
- * 2: list<string>,
- * 3: list<array{int, int, int, int}>,
- * 4: list<array{int, int}>
- * }
- */
- 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 802f472..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use RuntimeException;
-use Throwable;
-
-use function defined;
-use function error_reporting;
-use function fwrite;
-use function ini_set;
-use function set_error_handler;
-use function set_exception_handler;
-
-use const E_ALL;
-use const E_STRICT;
-use const STDERR;
-
-final class ErrorHandler
-{
- /** @var bool */
- private static $exceptions_enabled = true;
-
- public static function install(): void
- {
- self::setErrorReporting();
- self::installErrorHandler();
- self::installExceptionHandler();
- }
-
- /**
- * @template T
- * @param callable():T $f
- * @return T
- */
- public static function runWithExceptionsSuppressed(callable $f)
- {
- try {
- self::$exceptions_enabled = false;
- return $f();
- } finally {
- self::$exceptions_enabled = true;
- }
- }
-
- /** @psalm-suppress UnusedConstructor added to prevent instantiations */
- private function __construct()
- {
- }
-
- private static function setErrorReporting(): void
- {
- error_reporting(E_ALL | E_STRICT);
- ini_set('display_errors', '1');
- }
-
- private static function installErrorHandler(): void
- {
- set_error_handler(static function (
- int $error_code,
- string $error_message,
- string $error_filename = 'unknown',
- int $error_line = -1
- ): bool {
- if (ErrorHandler::$exceptions_enabled && ($error_code & error_reporting())) {
- throw new RuntimeException(
- 'PHP Error: ' . $error_message . ' in ' . $error_filename . ':' . $error_line,
- $error_code
- );
- }
- // let PHP handle suppressed errors how it sees fit
- return false;
- });
- }
-
- private static function installExceptionHandler(): void
- {
- /**
- * If there is an uncaught exception,
- * then print more of the backtrace than is done by default to stderr,
- * then exit with a non-zero exit code to indicate failure.
- */
- set_exception_handler(static function (Throwable $throwable): void {
- fwrite(STDERR, "Uncaught $throwable\n");
- $version = defined('PSALM_VERSION') ? PSALM_VERSION : '(unknown version)';
- fwrite(STDERR, "(Psalm $version crashed due to an uncaught Throwable)\n");
- exit(1);
- });
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php b/vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php
deleted file mode 100644
index c7d2265..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/EventDispatcher.php
+++ /dev/null
@@ -1,621 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Psalm\Plugin\EventHandler\AddTaintsInterface;
-use Psalm\Plugin\EventHandler\AfterAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterClassLikeAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterClassLikeExistenceCheckInterface;
-use Psalm\Plugin\EventHandler\AfterClassLikeVisitInterface;
-use Psalm\Plugin\EventHandler\AfterCodebasePopulatedInterface;
-use Psalm\Plugin\EventHandler\AfterEveryFunctionCallAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterExpressionAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterFileAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterFunctionCallAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterFunctionLikeAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterMethodCallAnalysisInterface;
-use Psalm\Plugin\EventHandler\AfterStatementAnalysisInterface;
-use Psalm\Plugin\EventHandler\BeforeFileAnalysisInterface;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Plugin\EventHandler\Event\AfterAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeExistenceCheckEvent;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeVisitEvent;
-use Psalm\Plugin\EventHandler\Event\AfterCodebasePopulatedEvent;
-use Psalm\Plugin\EventHandler\Event\AfterEveryFunctionCallAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterExpressionAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterFileAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterFunctionCallAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterMethodCallAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\AfterStatementAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\BeforeFileAnalysisEvent;
-use Psalm\Plugin\EventHandler\Event\StringInterpreterEvent;
-use Psalm\Plugin\EventHandler\RemoveTaintsInterface;
-use Psalm\Plugin\EventHandler\StringInterpreterInterface;
-use Psalm\Plugin\Hook\AfterAnalysisInterface as LegacyAfterAnalysisInterface;
-use Psalm\Plugin\Hook\AfterClassLikeAnalysisInterface as LegacyAfterClassLikeAnalysisInterface;
-use Psalm\Plugin\Hook\AfterClassLikeExistenceCheckInterface as LegacyAfterClassLikeExistenceCheckInterface;
-use Psalm\Plugin\Hook\AfterClassLikeVisitInterface as LegacyAfterClassLikeVisitInterface;
-use Psalm\Plugin\Hook\AfterCodebasePopulatedInterface as LegacyAfterCodebasePopulatedInterface;
-use Psalm\Plugin\Hook\AfterEveryFunctionCallAnalysisInterface as LegacyAfterEveryFunctionCallAnalysisInterface;
-use Psalm\Plugin\Hook\AfterExpressionAnalysisInterface as LegacyAfterExpressionAnalysisInterface;
-use Psalm\Plugin\Hook\AfterFileAnalysisInterface as LegacyAfterFileAnalysisInterface;
-use Psalm\Plugin\Hook\AfterFunctionCallAnalysisInterface as LegacyAfterFunctionCallAnalysisInterface;
-use Psalm\Plugin\Hook\AfterFunctionLikeAnalysisInterface as LegacyAfterFunctionLikeAnalysisInterface;
-use Psalm\Plugin\Hook\AfterMethodCallAnalysisInterface as LegacyAfterMethodCallAnalysisInterface;
-use Psalm\Plugin\Hook\AfterStatementAnalysisInterface as LegacyAfterStatementAnalysisInterface;
-use Psalm\Plugin\Hook\BeforeFileAnalysisInterface as LegacyBeforeFileAnalysisInterface;
-use Psalm\Plugin\Hook\StringInterpreterInterface as LegacyStringInterpreterInterface;
-use Psalm\Type\Atomic\TLiteralString;
-
-use function array_merge;
-use function count;
-use function is_subclass_of;
-
-class EventDispatcher
-{
- /**
- * Static methods to be called after method checks have completed
- *
- * @var list<class-string<AfterMethodCallAnalysisInterface>>
- */
- private $after_method_checks = [];
- /** @var list<class-string<LegacyAfterMethodCallAnalysisInterface>> */
- 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<class-string<AfterFunctionCallAnalysisInterface>>
- */
- public $after_function_checks = [];
- /** @var list<class-string<LegacyAfterFunctionCallAnalysisInterface>> */
- 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<class-string<AfterEveryFunctionCallAnalysisInterface>>
- */
- public $after_every_function_checks = [];
- /** @var list<class-string<LegacyAfterEveryFunctionCallAnalysisInterface>> */
- public $legacy_after_every_function_checks = [];
-
- /**
- * Static methods to be called after expression checks have completed
- *
- * @var list<class-string<AfterExpressionAnalysisInterface>>
- */
- public $after_expression_checks = [];
- /** @var list<class-string<LegacyAfterExpressionAnalysisInterface>> */
- public $legacy_after_expression_checks = [];
-
- /**
- * Static methods to be called after statement checks have completed
- *
- * @var list<class-string<AfterStatementAnalysisInterface>>
- */
- public $after_statement_checks = [];
- /** @var list<class-string<LegacyAfterStatementAnalysisInterface>> */
- public $legacy_after_statement_checks = [];
-
- /**
- * Static methods to be called after method checks have completed
- *
- * @var list<class-string<StringInterpreterInterface>>
- */
- public $string_interpreters = [];
- /** @var list<class-string<LegacyStringInterpreterInterface>> */
- public $legacy_string_interpreters = [];
-
- /**
- * Static methods to be called after classlike exists checks have completed
- *
- * @var list<class-string<AfterClassLikeExistenceCheckInterface>>
- */
- public $after_classlike_exists_checks = [];
- /** @var list<class-string<LegacyAfterClassLikeExistenceCheckInterface>> */
- public $legacy_after_classlike_exists_checks = [];
-
- /**
- * Static methods to be called after classlike checks have completed
- *
- * @var list<class-string<AfterClassLikeAnalysisInterface>>
- */
- public $after_classlike_checks = [];
- /** @var list<class-string<LegacyAfterClassLikeAnalysisInterface>> */
- public $legacy_after_classlike_checks = [];
-
- /**
- * Static methods to be called after classlikes have been scanned
- *
- * @var list<class-string<AfterClassLikeVisitInterface>>
- */
- private $after_visit_classlikes = [];
- /** @var list<class-string<LegacyAfterClassLikeVisitInterface>> */
- private $legacy_after_visit_classlikes = [];
-
- /**
- * Static methods to be called after codebase has been populated
- *
- * @var list<class-string<AfterCodebasePopulatedInterface>>
- */
- public $after_codebase_populated = [];
- /** @var list<class-string<LegacyAfterCodebasePopulatedInterface>> */
- public $legacy_after_codebase_populated = [];
-
- /**
- * Static methods to be called after codebase has been populated
- *
- * @var list<class-string<AfterAnalysisInterface>>
- */
- public $after_analysis = [];
- /** @var list<class-string<LegacyAfterAnalysisInterface>> */
- public $legacy_after_analysis = [];
-
- /**
- * Static methods to be called after a file has been analyzed
- *
- * @var list<class-string<AfterFileAnalysisInterface>>
- */
- public $after_file_checks = [];
- /** @var list<class-string<LegacyAfterFileAnalysisInterface>> */
- public $legacy_after_file_checks = [];
-
- /**
- * Static methods to be called before a file is analyzed
- *
- * @var list<class-string<BeforeFileAnalysisInterface>>
- */
- public $before_file_checks = [];
- /** @var list<class-string<LegacyBeforeFileAnalysisInterface>> */
- public $legacy_before_file_checks = [];
-
- /**
- * Static methods to be called after functionlike checks have completed
- *
- * @var list<class-string<AfterFunctionLikeAnalysisInterface>>
- */
- public $after_functionlike_checks = [];
- /** @var list<class-string<LegacyAfterFunctionLikeAnalysisInterface>> */
- public $legacy_after_functionlike_checks = [];
-
- /**
- * Static methods to be called to see if taints should be added
- *
- * @var list<class-string<AddTaintsInterface>>
- */
- public $add_taints_checks = [];
-
- /**
- * Static methods to be called to see if taints should be removed
- *
- * @var list<class-string<RemoveTaintsInterface>>
- */
- 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<string>
- */
- 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<string>
- */
- 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 858e7f4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php
+++ /dev/null
@@ -1,321 +0,0 @@
-<?php
-
-namespace Psalm\Internal\ExecutionEnvironment;
-
-use Psalm\SourceControl\Git\CommitInfo;
-use Psalm\SourceControl\Git\GitInfo;
-
-use function explode;
-use function file_get_contents;
-use function json_decode;
-use function str_replace;
-use function strpos;
-use function strtotime;
-
-/**
- * Environment variables collector for CI environment.
- *
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- */
-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 e782128..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Psalm\Internal\ExecutionEnvironment;
-
-use Psalm\SourceControl\Git\CommitInfo;
-use Psalm\SourceControl\Git\GitInfo;
-use Psalm\SourceControl\Git\RemoteInfo;
-use RuntimeException;
-
-use function array_keys;
-use function array_unique;
-use function count;
-use function explode;
-use function range;
-use function strpos;
-use function trim;
-
-/**
- * Git repository info collector.
- *
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- */
-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<RemoteInfo>
- */
- 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 97113ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace Psalm\Internal\ExecutionEnvironment;
-
-use RuntimeException;
-
-use function exec;
-use function function_exists;
-use function sprintf;
-
-/**
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * @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 f953ad9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-namespace Psalm\Internal\FileManipulation;
-
-use PhpParser\Node\Stmt\Class_;
-use Psalm\DocComment;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Scanner\ParsedDocblock;
-
-use function ltrim;
-use function str_replace;
-use function strlen;
-use function strrpos;
-use function substr;
-
-/**
- * @internal
- */
-class ClassDocblockManipulator
-{
- /**
- * @var array<string, array<int, self>>
- */
- 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<int, FileManipulation>
- */
- 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 086af29..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/CodeMigration.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-namespace Psalm\Internal\FileManipulation;
-
-/**
- * @psalm-immutable
- */
-class CodeMigration
-{
- /** @var string */
- public $source_file_path;
-
- /** @var int */
- public $source_start;
-
- /** @var int */
- public $source_end;
-
- /** @var string */
- public $destination_file_path;
-
- /** @var int */
- public $destination_start;
-
- public function __construct(
- string $source_file_path,
- int $source_start,
- int $source_end,
- string $destination_file_path,
- int $destination_start
- ) {
- $this->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 1ed9c6c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php
-
-namespace Psalm\Internal\FileManipulation;
-
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Provider\FileProvider;
-
-use function array_merge;
-use function preg_match;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function substr;
-use function substr_replace;
-
-/**
- * @internal
- */
-class FileManipulationBuffer
-{
- /** @var array<string, FileManipulation[]> */
- 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<string, FileManipulation[]>
- */
- 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<string, FileManipulation[]>
- */
- 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 ca65233..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php
+++ /dev/null
@@ -1,579 +0,0 @@
-<?php
-
-namespace Psalm\Internal\FileManipulation;
-
-use PhpParser;
-use PhpParser\Node\Expr\ArrowFunction;
-use PhpParser\Node\Expr\Closure;
-use PhpParser\Node\FunctionLike;
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\Node\Stmt\Function_;
-use Psalm\DocComment;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Scanner\ParsedDocblock;
-
-use function array_key_exists;
-use function array_merge;
-use function array_reduce;
-use function count;
-use function is_string;
-use function ltrim;
-use function preg_match;
-use function reset;
-use function str_replace;
-use function str_split;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function substr;
-
-/**
- * @internal
- */
-class FunctionDocblockManipulator
-{
- /**
- * Manipulators ordered by line number
- *
- * @var array<string, array<int, FunctionDocblockManipulator>>
- */
- 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<string, string> */
- private $new_php_param_types = [];
-
- /** @var array<string, string> */
- private $new_phpdoc_param_types = [];
-
- /** @var array<string, string> */
- private $new_psalm_param_types = [];
-
- /** @var string */
- private $indentation;
-
- /** @var string|null */
- private $return_type_description;
-
- /** @var array<string, int> */
- private $param_offsets = [];
-
- /** @var array<string, array{int, int}> */
- private $param_typehint_offsets = [];
-
- /** @var bool */
- private $is_pure = false;
-
- /** @var list<string> */
- 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(['<mixed, mixed>', '<array-key, mixed>'], '', $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(['<mixed, mixed>', '<array-key, mixed>', '<empty, empty>'], '', $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<int, FileManipulation>
- */
- 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<string> $exceptions
- */
- public function addThrowsDocblock(array $exceptions): void
- {
- $this->throwsExceptions = $exceptions;
- }
-
- public static function clearCache(): void
- {
- self::$manipulators = [];
- }
-
- /**
- * @param array<string, array<int, FunctionDocblockManipulator>> $manipulators
- */
- public static function addManipulators(array $manipulators): void
- {
- self::$manipulators = array_merge($manipulators, self::$manipulators);
- }
-
- /**
- * @return array<string, array<int, FunctionDocblockManipulator>>
- */
- 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 0ee9654..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php
+++ /dev/null
@@ -1,281 +0,0 @@
-<?php
-
-namespace Psalm\Internal\FileManipulation;
-
-use PhpParser\Node\Stmt\Property;
-use Psalm\Config;
-use Psalm\DocComment;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use UnexpectedValueException;
-
-use function array_shift;
-use function count;
-use function ltrim;
-use function str_replace;
-use function strlen;
-use function strrpos;
-use function substr;
-use function substr_count;
-
-/**
- * @internal
- */
-class PropertyDocblockManipulator
-{
- /**
- * @var array<string, array<int, self>>
- */
- 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(['<mixed, mixed>', '<array-key, mixed>', '<empty, empty>'], '', $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<int, FileManipulation>
- */
- 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 bd1e146..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkMessage.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-interface ForkMessage
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php b/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php
deleted file mode 100644
index edda8ca..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-/**
- * @psalm-immutable
- */
-class ForkProcessDoneMessage implements ForkMessage
-{
- /** @var mixed */
- public $data;
-
- /**
- * @param mixed $data
- */
- public function __construct($data)
- {
- $this->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 0794c9d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-/**
- * @psalm-immutable
- */
-class ForkProcessErrorMessage implements ForkMessage
-{
- /** @var string */
- public $message;
-
- public function __construct(string $message)
- {
- $this->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 7c43220..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-/**
- * @psalm-immutable
- */
-class ForkTaskDoneMessage implements ForkMessage
-{
- /** @var mixed */
- public $data;
-
- /**
- * @param mixed $data
- */
- public function __construct($data)
- {
- $this->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 3d0ad04..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php
+++ /dev/null
@@ -1,492 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-use Closure;
-use Exception;
-use Psalm\Config;
-use Throwable;
-
-use function array_fill_keys;
-use function array_keys;
-use function array_map;
-use function array_pop;
-use function array_values;
-use function assert;
-use function base64_decode;
-use function base64_encode;
-use function count;
-use function error_get_last;
-use function error_log;
-use function explode;
-use function extension_loaded;
-use function fclose;
-use function feof;
-use function fread;
-use function fwrite;
-use function get_class;
-use function gettype;
-use function igbinary_serialize;
-use function igbinary_unserialize;
-use function in_array;
-use function ini_get;
-use function pcntl_fork;
-use function pcntl_waitpid;
-use function pcntl_wexitstatus;
-use function pcntl_wifsignaled;
-use function pcntl_wtermsig;
-use function posix_get_last_error;
-use function posix_kill;
-use function posix_strerror;
-use function serialize;
-use function stream_select;
-use function stream_set_blocking;
-use function stream_socket_pair;
-use function stripos;
-use function strlen;
-use function strpos;
-use function substr;
-use function unserialize;
-use function usleep;
-use function version_compare;
-
-use const PHP_EOL;
-use const PHP_OS;
-use const PHP_VERSION;
-use const SIGALRM;
-use const SIGTERM;
-use const STREAM_IPPROTO_IP;
-use const STREAM_PF_UNIX;
-use const STREAM_SOCK_STREAM;
-
-/**
- * Adapted with relatively few changes from
- * https://github.com/etsy/phan/blob/1ccbe7a43a6151ca7c0759d6c53e2c3686994e53/src/Phan/ForkPool.php
- *
- * Authors: https://github.com/morria, https://github.com/TysonAndre
- *
- * Fork off to n-processes and divide up tasks between
- * each process.
- */
-class Pool
-{
- private const EXIT_SUCCESS = 0;
- private const EXIT_FAILURE = 1;
-
- /** @var Config */
- private $config;
-
- /** @var int[] */
- private $child_pid_list = [];
-
- /** @var resource[] */
- private $read_streams = [];
-
- /** @var bool */
- private $did_have_error = false;
-
- /** @var ?Closure(mixed): void */
- private $task_done_closure;
-
- public const MAC_PCRE_MESSAGE = 'Mac users: pcre.jit is set to 1 in your PHP config.' . PHP_EOL
- . 'The pcre jit is known to cause segfaults in PHP 7.3 on Macs, and Psalm' . PHP_EOL
- . 'will not execute in threaded mode to avoid indecipherable errors.' . PHP_EOL
- . 'Consider adding pcre.jit=0 to your PHP config, or upgrade to PHP 7.4.' . PHP_EOL
- . 'Relevant info: https://bugs.php.net/bug.php?id=77260';
-
- /**
- * @param Config $config
- * @param array<int, array<int, mixed>> $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<mixed>
- */
- 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<mixed>
- */
- 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 0ca2e1a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Fork;
-
-use Composer\XdebugHandler\XdebugHandler;
-
-use function array_filter;
-use function extension_loaded;
-use function file_get_contents;
-use function file_put_contents;
-use function implode;
-use function preg_replace;
-
-/**
- * @internal
- */
-class PsalmRestarter extends XdebugHandler
-{
- /**
- * @var bool
- */
- private $required = false;
-
- /**
- * @var string[]
- */
- private $disabledExtensions = [];
-
- public function disableExtension(string $disabledExtension): void
- {
- $this->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 6cd2477..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/IncludeCollector.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use function array_diff;
-use function array_merge;
-use function array_unique;
-use function array_values;
-use function get_included_files;
-use function preg_grep;
-
-use const PREG_GREP_INVERT;
-
-/**
- * Include collector
- *
- * Used to execute code that may cause file inclusions, and report what files have been included
- * NOTE: dependencies of this class should be kept at minimum, as it's used before autoloader is
- * registered.
- */
-final class IncludeCollector
-{
- /** @var list<string> */
- 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<string> */
- public function getIncludedFiles(): array
- {
- return $this->included_files;
- }
-
- /** @return list<string> */
- 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 2e2445f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Json/Json.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Json;
-
-use RuntimeException;
-
-use function json_encode;
-use function json_last_error_msg;
-
-use const JSON_PRETTY_PRINT;
-use const JSON_UNESCAPED_SLASHES;
-use const JSON_UNESCAPED_UNICODE;
-
-/**
- * Provides ability of pretty printed JSON output.
- */
-class Json
-{
- public const PRETTY = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
-
- /**
- * @var int
- */
- public const DEFAULT = 0;
-
- /**
- * @param mixed $data
- *
- *
- * @psalm-pure
- */
- public static function encode($data, ?int $options = null): string
- {
- if ($options === null) {
- $options = self::DEFAULT;
- }
-
- $result = json_encode($data, $options);
- if ($result === false) {
- /** @psalm-suppress ImpureFunctionCall */
- throw new RuntimeException('Cannot create JSON string: '.json_last_error_msg());
- }
-
- return $result;
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php
deleted file mode 100644
index 26cd646..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Client/TextDocument.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer\Client;
-
-use Amp\Promise;
-use Generator;
-use JsonMapper;
-use LanguageServerProtocol\Diagnostic;
-use LanguageServerProtocol\TextDocumentIdentifier;
-use LanguageServerProtocol\TextDocumentItem;
-use Psalm\Internal\LanguageServer\ClientHandler;
-
-use function Amp\call;
-
-/**
- * Provides method handlers for all textDocument/* methods
- */
-class TextDocument
-{
- /**
- * @var ClientHandler
- */
- private $handler;
-
- /**
- * @var JsonMapper
- */
- private $mapper;
-
- public function __construct(ClientHandler $handler, JsonMapper $mapper)
- {
- $this->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<TextDocumentItem> The document's current content
- */
- public function xcontent(TextDocumentIdentifier $textDocument): Promise
- {
- return call(
- /**
- * @return Generator<int, Promise<object>, object, TextDocumentItem>
- */
- function () use ($textDocument) {
- /** @var Promise<object> */
- $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 8c70156..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ClientHandler.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use AdvancedJsonRpc\Notification;
-use AdvancedJsonRpc\Request;
-use AdvancedJsonRpc\Response;
-use AdvancedJsonRpc\SuccessResponse;
-use Amp\Deferred;
-use Amp\Promise;
-use Generator;
-
-use function Amp\call;
-use function error_log;
-
-/**
- * @internal
- */
-class ClientHandler
-{
- /**
- * @var ProtocolReader
- */
- public $protocolReader;
-
- /**
- * @var ProtocolWriter
- */
- public $protocolWriter;
-
- /**
- * @var IdGenerator
- */
- public $idGenerator;
-
- public function __construct(ProtocolReader $protocolReader, ProtocolWriter $protocolWriter)
- {
- $this->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<mixed> 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<int, Promise, mixed, Promise<mixed>>
- */
- 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 9f8f80b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterInterface.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-/**
- * Event Emitter Interface
- *
- * Anything that accepts listeners and emits events should implement this
- * interface.
- *
- * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
- * @author Evert Pot (http://evertpot.com/)
- * @license http://sabre.io/license/ Modified BSD License
- */
-interface EmitterInterface
-{
- /**
- * Subscribe to an event.
- */
- public function on(string $eventName, callable $callBack, int $priority = 100): void;
-
- /**
- * 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<mixed> $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 50535d0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/EmitterTrait.php
+++ /dev/null
@@ -1,157 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use function array_multisort;
-use function call_user_func_array;
-use function count;
-
-use const SORT_NUMERIC;
-
-/**
- * Event Emitter Trait
- *
- * This trait contains all the basic functions to implement an
- * EventEmitterInterface.
- *
- * Using the trait + interface allows you to add EventEmitter capabilities
- * without having to change your base-class.
- *
- * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
- * @author Evert Pot (http://evertpot.com/)
- * @license http://sabre.io/license/ Modified BSD License
- */
-trait EmitterTrait
-{
- /**
- * The list of listeners
- *
- * @var array<string, array{0: bool, 1: int[], 2: callable[]}>
- */
- 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<mixed> $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 a7eee0f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/IdGenerator.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-/**
- * Generates unique, incremental IDs for use as request IDs
- */
-class IdGenerator
-{
- /**
- * @var int
- */
- public $counter = 1;
-
- /**
- * Returns a unique ID
- *
- */
- public function generate(): int
- {
- return $this->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 9c2ef14..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageClient.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use JsonMapper;
-use Psalm\Internal\LanguageServer\Client\TextDocument as ClientTextDocument;
-
-/**
- * @internal
- */
-class LanguageClient
-{
- /**
- * Handles textDocument/* methods
- *
- * @var ClientTextDocument
- */
- public $textDocument;
-
- /**
- * The client handler
- *
- * @var ClientHandler
- */
- private $handler;
-
- public function __construct(ProtocolReader $reader, ProtocolWriter $writer)
- {
- $this->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 30c48be..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/LanguageServer.php
+++ /dev/null
@@ -1,575 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use AdvancedJsonRpc\Dispatcher;
-use AdvancedJsonRpc\Error;
-use AdvancedJsonRpc\ErrorCode;
-use AdvancedJsonRpc\ErrorResponse;
-use AdvancedJsonRpc\Request;
-use AdvancedJsonRpc\Response;
-use AdvancedJsonRpc\SuccessResponse;
-use Amp\Promise;
-use Amp\Success;
-use Generator;
-use InvalidArgumentException;
-use LanguageServerProtocol\ClientCapabilities;
-use LanguageServerProtocol\CompletionOptions;
-use LanguageServerProtocol\Diagnostic;
-use LanguageServerProtocol\DiagnosticSeverity;
-use LanguageServerProtocol\InitializeResult;
-use LanguageServerProtocol\Position;
-use LanguageServerProtocol\Range;
-use LanguageServerProtocol\SaveOptions;
-use LanguageServerProtocol\ServerCapabilities;
-use LanguageServerProtocol\SignatureHelpOptions;
-use LanguageServerProtocol\TextDocumentSyncKind;
-use LanguageServerProtocol\TextDocumentSyncOptions;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\LanguageServer\Server\TextDocument as ServerTextDocument;
-use Psalm\Internal\LanguageServer\Server\Workspace as ServerWorkspace;
-use Psalm\IssueBuffer;
-use Throwable;
-
-use function Amp\asyncCoroutine;
-use function Amp\call;
-use function array_combine;
-use function array_keys;
-use function array_map;
-use function array_shift;
-use function array_unshift;
-use function explode;
-use function implode;
-use function max;
-use function parse_url;
-use function rawurlencode;
-use function realpath;
-use function str_replace;
-use function strpos;
-use function substr;
-use function trim;
-use function urldecode;
-
-/**
- * @internal
- */
-class LanguageServer extends Dispatcher
-{
- /**
- * Handles textDocument/* method calls
- *
- * @var ?ServerTextDocument
- */
- public $textDocument;
-
- /**
- * Handles workspace/* method calls
- *
- * @var ?ServerWorkspace
- */
- public $workspace;
-
- /**
- * @var ProtocolReader
- */
- protected $protocolReader;
-
- /**
- * @var ProtocolWriter
- */
- protected $protocolWriter;
-
- /**
- * @var LanguageClient
- */
- public $client;
-
- /**
- * @var ProjectAnalyzer
- */
- protected $project_analyzer;
-
- /**
- * @var array<string, string>
- */
- protected $onsave_paths_to_analyze = [];
-
- /**
- * @var array<string, string>
- */
- protected $onchange_paths_to_analyze = [];
-
- /**
- * @var array<string, list<IssueData>>
- */
- 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<int, Promise, mixed, void>
- */
- 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<InitializeResult>
- * @psalm-suppress PossiblyUnusedMethod
- */
- public function initialize(
- ClientCapabilities $capabilities,
- ?string $rootPath = null,
- ?int $processId = null
- ): Promise {
- return call(
- /** @return Generator<int, true, mixed, InitializeResult> */
- 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<string, string> $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<string, list<IssueData>>
- */
- 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 be33625..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Message.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use AdvancedJsonRpc\Message as MessageBody;
-
-use function array_pop;
-use function explode;
-use function strlen;
-
-/**
- * @internal
- */
-class Message
-{
- /**
- * @var ?MessageBody
- */
- public $body;
-
- /**
- * @var string[]
- */
- public $headers;
-
- /**
- * Parses a message
- *
- *
- * @psalm-suppress UnusedMethod
- */
- public static function parse(string $msg): Message
- {
- $obj = new self;
- $parts = explode("\r\n", $msg);
- $obj->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 dbc23d2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolReader.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-/**
- * Must emit a "message" event with a Message object as parameter
- * when a message comes in
- *
- * Must emit a "close" event when the stream closes
- */
-interface ProtocolReader extends EmitterInterface
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php
deleted file mode 100644
index 68073df..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use AdvancedJsonRpc\Message as MessageBody;
-use Amp\ByteStream\ResourceInputStream;
-use Amp\Promise;
-use Exception;
-use Generator;
-
-use function Amp\asyncCall;
-use function explode;
-use function strlen;
-use function substr;
-use function trim;
-
-/**
- * Source: https://github.com/felixfbecker/php-language-server/tree/master/src/ProtocolStreamReader.php
- */
-class ProtocolStreamReader implements ProtocolReader
-{
- use EmitterTrait;
-
- private const PARSE_HEADERS = 1;
- private const PARSE_BODY = 2;
-
- /**
- * This is checked by ProtocolStreamReader so that it will stop reading from streams in the forked process.
- * There could be buffered bytes in stdin/over TCP, those would be processed by TCP if it were not for this check.
- *
- * @var bool
- */
- private $is_accepting_new_requests = true;
- /** @var int */
- private $parsing_mode = self::PARSE_HEADERS;
- /** @var string */
- private $buffer = '';
- /** @var string[] */
- private $headers = [];
- /** @var ?int */
- private $content_length;
- /** @var bool */
- private $did_emit_close = false;
-
- /**
- * @param resource $input
- */
- public function __construct($input)
- {
- $input = new ResourceInputStream($input);
- asyncCall(
- /**
- * @return Generator<int, Promise<?string>, ?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 cedd7c7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use Amp\ByteStream\ResourceOutputStream;
-use Amp\Promise;
-
-/**
- * @internal
- */
-class ProtocolStreamWriter implements ProtocolWriter
-{
- /**
- * @var ResourceOutputStream
- */
- private $output;
-
- /**
- * @param resource $output
- */
- public function __construct($output)
- {
- $this->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 6d5ce01..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/ProtocolWriter.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer;
-
-use Amp\Promise;
-
-interface ProtocolWriter
-{
- /**
- * Sends a Message to the client
- *
- *
- * @return Promise Resolved when the message has been fully written out to the output stream
- */
- public function write(Message $msg): Promise;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php b/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php
deleted file mode 100644
index 46cbabe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/TextDocument.php
+++ /dev/null
@@ -1,410 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer\Server;
-
-use Amp\Promise;
-use Amp\Success;
-use LanguageServerProtocol\CompletionList;
-use LanguageServerProtocol\Hover;
-use LanguageServerProtocol\Location;
-use LanguageServerProtocol\MarkupContent;
-use LanguageServerProtocol\MarkupKind;
-use LanguageServerProtocol\Position;
-use LanguageServerProtocol\Range;
-use LanguageServerProtocol\SignatureHelp;
-use LanguageServerProtocol\TextDocumentContentChangeEvent;
-use LanguageServerProtocol\TextDocumentIdentifier;
-use LanguageServerProtocol\TextDocumentItem;
-use LanguageServerProtocol\TextEdit;
-use LanguageServerProtocol\VersionedTextDocumentIdentifier;
-use LanguageServerProtocol\WorkspaceEdit;
-use Psalm\Codebase;
-use Psalm\Exception\UnanalyzedFileException;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\LanguageServer\LanguageServer;
-use UnexpectedValueException;
-
-use function array_values;
-use function count;
-use function error_log;
-use function preg_match;
-use function substr_count;
-
-/**
- * Provides method handlers for all textDocument/* methods
- */
-class TextDocument
-{
- /**
- * @var LanguageServer
- */
- protected $server;
-
- /**
- * @var Codebase
- */
- protected $codebase;
-
- /**
- * @var ProjectAnalyzer
- */
- protected $project_analyzer;
-
- public function __construct(
- LanguageServer $server,
- Codebase $codebase,
- ProjectAnalyzer $project_analyzer
- ) {
- $this->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<Location>|Promise<null>
- */
- 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<Hover>|Promise<null>
- */
- 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<array<empty, empty>>|Promise<CompletionList>
- */
- 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 c1bc2bd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/LanguageServer/Server/Workspace.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\LanguageServer\Server;
-
-use LanguageServerProtocol\FileChangeType;
-use LanguageServerProtocol\FileEvent;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\LanguageServer\LanguageServer;
-
-/**
- * Provides method handlers for all workspace/* methods
- */
-class Workspace
-{
- /**
- * @var LanguageServer
- */
- protected $server;
-
- /**
- * @var Codebase
- */
- protected $codebase;
-
- /**
- * @var ProjectAnalyzer
- */
- protected $project_analyzer;
-
- public function __construct(
- LanguageServer $server,
- Codebase $codebase,
- ProjectAnalyzer $project_analyzer
- ) {
- $this->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 cf4c81b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/MethodIdentifier.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use InvalidArgumentException;
-
-use function explode;
-use function is_string;
-use function preg_replace;
-use function strpos;
-use function strtolower;
-
-/**
- * @psalm-immutable
- */
-class MethodIdentifier
-{
- public $fq_class_name;
- public $method_name;
-
- /**
- * @param lowercase-string $method_name
- */
- public function __construct(string $fq_class_name, string $method_name)
- {
- $this->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 2c96c6b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpTraverser/CustomTraverser.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\PhpTraverser;
-
-use LogicException;
-use PhpParser\Node;
-use PhpParser\NodeTraverser;
-
-use function array_pop;
-use function array_splice;
-use function gettype;
-use function is_array;
-
-/**
- * @internal
- */
-class CustomTraverser extends NodeTraverser
-{
- public function __construct()
- {
- $this->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 a3fd78e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-
-/**
- * @internal
- *
- * This produces a graph of probably assignments inside a loop
- *
- * With this map we can calculate how many times the loop analysis must
- * be run before all variables have the correct types
- */
-class AssignmentMapVisitor extends PhpParser\NodeVisitorAbstract
-{
- /**
- * @var array<string, array<string, bool>>
- */
- 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<string, array<string, bool>>
- */
- 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 a57eeab..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-
-/**
- * @internal
- */
-class CheckTrivialExprVisitor extends PhpParser\NodeVisitorAbstract
-{
- /**
- * @var array<int, PhpParser\Node\Expr>
- */
- 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<int, PhpParser\Node\Expr>
- */
- 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 befd1d1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/CloningVisitor.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser\Comment;
-use PhpParser\Node;
-use PhpParser\NodeVisitorAbstract;
-
-use function array_map;
-
-/**
- * Visitor cloning all nodes and linking to the original nodes using an attribute.
- *
- * This visitor is required to perform format-preserving pretty prints.
- */
-class CloningVisitor extends NodeVisitorAbstract
-{
- public function enterNode(Node $node): Node
- {
- $node = clone $node;
- if ($cs = $node->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 c368f37..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser\Node;
-use PhpParser\Node\Expr;
-use PhpParser\NodeVisitorAbstract;
-use Psalm\Internal\Provider\NodeDataProvider;
-
-class ConditionCloningVisitor extends NodeVisitorAbstract
-{
- private $type_provider;
-
- public function __construct(NodeDataProvider $old_type_provider)
- {
- $this->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 f951578..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use Psalm\Internal\Provider\NodeDataProvider;
-
-/**
- * @internal
- */
-class NodeCleanerVisitor extends PhpParser\NodeVisitorAbstract
-{
- private $type_provider;
-
- public function __construct(NodeDataProvider $type_provider)
- {
- $this->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 dd71903..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-
-/**
- * @internal
- */
-class NodeCounterVisitor extends PhpParser\NodeVisitorAbstract
-{
- /** @var int */
- public $count = 0;
-
- public function enterNode(PhpParser\Node $node): ?int
- {
- $this->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 7e3de32..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-
-/**
- * Shifts all nodes in a given AST by a set amount
- */
-class OffsetShifterVisitor extends PhpParser\NodeVisitorAbstract
-{
- /** @var int */
- private $file_offset;
-
- /** @var int */
- private $line_offset;
-
- /** @var array<int, int> */
- private $extra_offsets;
-
- /**
- * @param array<int, int> $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 32fe8e3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use Psalm\FileManipulation;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Scanner\DocblockParser;
-
-use function rtrim;
-use function str_replace;
-use function strlen;
-
-/**
- * @internal
- */
-class ParamReplacementVisitor extends PhpParser\NodeVisitorAbstract
-{
- /** @var string */
- private $old_name;
-
- /** @var string */
- private $new_name;
-
- /** @var list<FileManipulation> */
- 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<FileManipulation>
- */
- 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 9734be2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php
+++ /dev/null
@@ -1,409 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use PhpParser\ErrorHandler\Collecting;
-use Psalm\Internal\PhpVisitor\OffsetShifterVisitor;
-
-use function count;
-use function preg_match_all;
-use function preg_replace;
-use function reset;
-use function str_repeat;
-use function strlen;
-use function strpos;
-use function strrpos;
-use function substr;
-use function substr_count;
-use function substr_replace;
-use function token_get_all;
-
-use const PREG_OFFSET_CAPTURE;
-use const PREG_SET_ORDER;
-
-/**
- * Given a list of file diffs, this scans an AST to find the sections it can replace, and parses
- * just those methods.
- */
-class PartialParserVisitor extends PhpParser\NodeVisitorAbstract
-{
- /** @var array<int, array{int, int, int, int, int}> */
- 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<int, array{int, int, int, int, int}> $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 = '<?php class _ {' . $method_contents . '}';
-
- $extra_characters = [];
-
- // To avoid a parser error during completion we replace
- //
- // Foo::
- // if (...) {}
- //
- // with
- //
- // Foo::;
- // if (...) {}
- //
- // When we insert the extra semicolon we have to keep track of the places
- // we inserted it, and then shift the AST node offsets accordingly after parsing
- // is complete.
- //
- // If anyone's unlucky enough to have a static method named "if" with a newline
- // before the method name e.g.
- //
- // Foo::
- // if(...);
- //
- // This transformation will break that.
- preg_match_all(
- '/(->|::)(\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 9caf12d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Storage\AttributeArg;
-use Psalm\Storage\AttributeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Type;
-
-use function strtolower;
-
-class AttributeResolver
-{
- public static function resolve(
- Codebase $codebase,
- FileScanner $file_scanner,
- FileStorage $file_storage,
- Aliases $aliases,
- PhpParser\Node\Attribute $stmt,
- ?string $fq_classlike_name
- ): AttributeStorage {
- if ($stmt->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 4572df3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php
+++ /dev/null
@@ -1,562 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use Exception;
-use PhpParser\Comment\Doc;
-use PhpParser\Node;
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\Node\Stmt\Class_;
-use Psalm\Aliases;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Provider\StatementsProvider;
-use Psalm\Internal\Scanner\ClassLikeDocblockComment;
-use Psalm\Internal\Scanner\DocblockParser;
-use Psalm\Internal\Type\ParseTree\MethodParamTree;
-use Psalm\Internal\Type\ParseTree\MethodTree;
-use Psalm\Internal\Type\ParseTree\MethodWithReturnTypeTree;
-use Psalm\Internal\Type\ParseTreeCreator;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Internal\Type\TypeTokenizer;
-
-use function array_key_first;
-use function array_shift;
-use function count;
-use function explode;
-use function implode;
-use function in_array;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function reset;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function substr_count;
-use function trim;
-
-use const PREG_OFFSET_CAPTURE;
-
-/**
- * @internal
- */
-class ClassLikeDocblockParser
-{
- /**
- * @throws DocblockParseException if there was a problem parsing the docblock
- */
- public static function parse(
- Node $node,
- Doc $comment,
- Aliases $aliases
- ): ClassLikeDocblockComment {
- $parsed_docblock = DocComment::parsePreservingLength($comment);
- $codebase = ProjectAnalyzer::getInstance()->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 = '/(?<!array\()\) ?(\: ?(\??[\\\\a-zA-Z0-9_]+))?/';
-
- if (preg_match($end_of_method_regex, $method_entry, $matches, PREG_OFFSET_CAPTURE)) {
- $method_entry = substr($method_entry, 0, $matches[0][1] + strlen($matches[0][0]));
- }
-
- $method_entry = str_replace([', ', '( '], [',', '('], $method_entry);
- $method_entry = preg_replace('/ (?!(\$|\.\.\.|&))/', '', trim($method_entry));
-
- // replace array bracket contents
- $method_entry = preg_replace('/\[([0-9a-zA-Z_\'\" ]+,)*([0-9a-zA-Z_\'\" ]+)\]/', '[]', $method_entry);
-
- if (!$method_entry) {
- throw new DocblockParseException('No @method entry specified');
- }
-
- try {
- $parse_tree_creator = new ParseTreeCreator(
- TypeTokenizer::getFullyQualifiedTokens(
- $method_entry,
- $aliases,
- null
- )
- );
-
- $method_tree = $parse_tree_creator->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 class A { ' . $function_docblock . ' public ' . $function_string . '{} }';
-
- try {
- $has_errors = false;
-
- $statements = StatementsProvider::parseStatements(
- $php_string,
- $codebase->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<string, array<int, string>> $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 91fbfbf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php
+++ /dev/null
@@ -1,1861 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use Exception;
-use InvalidArgumentException;
-use LogicException;
-use PhpParser;
-use PhpParser\Node\Expr\BinaryOp\Concat;
-use PhpParser\Node\Identifier;
-use PhpParser\Node\Name;
-use PhpParser\Node\NullableType;
-use PhpParser\Node\UnionType;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Exception\InvalidClasslikeOverrideException;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\Codebase\PropertyMap;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\ClassLikeDocblockComment;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Internal\Type\TypeAlias\ClassTypeAlias;
-use Psalm\Internal\Type\TypeAlias\InlineTypeAlias;
-use Psalm\Internal\Type\TypeAlias\LinkableTypeAlias;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Issue\DuplicateClass;
-use Psalm\Issue\DuplicateConstant;
-use Psalm\Issue\DuplicateEnumCase;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\InvalidEnumBackingType;
-use Psalm\Issue\InvalidTypeImport;
-use Psalm\Issue\MissingDocblockType;
-use Psalm\Issue\ParseError;
-use Psalm\IssueBuffer;
-use Psalm\Storage\AttributeStorage;
-use Psalm\Storage\ClassConstantStorage;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\EnumCaseStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use RuntimeException;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_pop;
-use function array_shift;
-use function array_values;
-use function assert;
-use function count;
-use function get_class;
-use function implode;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function str_replace;
-use function strtolower;
-use function trim;
-use function usort;
-
-use const PREG_SPLIT_DELIM_CAPTURE;
-use const PREG_SPLIT_NO_EMPTY;
-
-class ClassLikeNodeScanner
-{
- /**
- * @var FileScanner
- */
- private $file_scanner;
-
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * @var string
- */
- private $file_path;
-
- /**
- * @var Config
- */
- private $config;
-
- /**
- * @var FileStorage
- */
- private $file_storage;
-
- /**
- * @var array<string, InlineTypeAlias>
- */
- private $classlike_type_aliases = [];
-
- /**
- * @var array<string, array<string, Union>>
- */
- public $class_template_types = [];
-
- /**
- * @var PhpParser\Node\Name|null
- */
- private $namespace_name;
-
- /**
- * @var Aliases
- */
- private $aliases;
-
- /**
- * @var ?ClassLikeStorage
- */
- public $storage;
-
- /**
- * @var array<string, TypeAlias>
- */
- 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<AttributeStorage>
- */
- 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<string, LinkableTypeAlias>
- */
- private function getImportedTypeAliases(ClassLikeDocblockComment $comment, string $fq_classlike_name): array
- {
- /** @var array<string, LinkableTypeAlias> $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 "<TypeName> from <ClassName>",'
- . ' 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 "<TypeName> from <ClassName>", 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 <TypeName>", 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<string, TypeAlias> $type_aliases
- *
- * @return array<string, InlineTypeAlias>
- *
- * @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<string> $type_alias_comment_lines
- * @param array<string, TypeAlias> $type_aliases
- *
- * @return array<string, InlineTypeAlias>
- *
- * @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 3cf9d02..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php
+++ /dev/null
@@ -1,450 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use PhpParser\ConstExprEvaluationException;
-use PhpParser\ConstExprEvaluator;
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\ConstFetch;
-use Psalm\Aliases;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArrayOffsetFetch;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArraySpread;
-use Psalm\Internal\Scanner\UnresolvedConstant\ArrayValue;
-use Psalm\Internal\Scanner\UnresolvedConstant\ClassConstant;
-use Psalm\Internal\Scanner\UnresolvedConstant\Constant;
-use Psalm\Internal\Scanner\UnresolvedConstant\KeyValuePair;
-use Psalm\Internal\Scanner\UnresolvedConstant\ScalarValue;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedAdditionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseAnd;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseOr;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedBitwiseXor;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedConcatOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedDivisionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedMultiplicationOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedSubtractionOp;
-use Psalm\Internal\Scanner\UnresolvedConstant\UnresolvedTernary;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use ReflectionClass;
-use ReflectionFunction;
-
-use function assert;
-use function class_exists;
-use function function_exists;
-use function implode;
-use function interface_exists;
-use function strtolower;
-
-class ExpressionResolver
-{
- public static function getUnresolvedClassConstExpr(
- PhpParser\Node\Expr $stmt,
- Aliases $aliases,
- ?string $fq_classlike_name,
- ?string $parent_fq_class_name = null
- ): ?UnresolvedConstantComponent {
- if ($stmt instanceof PhpParser\Node\Expr\BinaryOp) {
- $left = self::getUnresolvedClassConstExpr(
- $stmt->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 2a6dbf7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php
+++ /dev/null
@@ -1,332 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Exception\FileIncludeException;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ConstFetchAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\IncludeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Type;
-
-use function assert;
-use function defined;
-use function dirname;
-use function explode;
-use function implode;
-use function in_array;
-use function preg_match;
-use function strpos;
-use function strtolower;
-use function substr;
-
-use const DIRECTORY_SEPARATOR;
-
-class ExpressionScanner
-{
- public static function scan(
- Codebase $codebase,
- FileScanner $file_scanner,
- FileStorage $file_storage,
- Aliases $aliases,
- PhpParser\Node\Expr $node,
- ?FunctionLikeStorage $functionlike_storage,
- ?int $skip_if_descendants
- ): void {
- if ($node instanceof PhpParser\Node\Expr\Include_ && !$skip_if_descendants) {
- self::visitInclude(
- $codebase,
- $file_storage,
- $node,
- $file_scanner->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 341d0f6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php
+++ /dev/null
@@ -1,697 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\DocComment;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Scanner\DocblockParser;
-use Psalm\Internal\Scanner\FunctionDocblockComment;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\IssueBuffer;
-
-use function array_shift;
-use function array_unique;
-use function count;
-use function explode;
-use function implode;
-use function in_array;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function reset;
-use function str_replace;
-use function stripos;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function substr_count;
-use function trim;
-
-class FunctionLikeDocblockParser
-{
- /**
- * @throws DocblockParseException if there was a problem parsing the docblock
- */
- public static function parse(
- PhpParser\Comment\Doc $comment,
- CodeLocation $code_location,
- string $cased_function_id
- ): FunctionDocblockComment {
- $parsed_docblock = DocComment::parsePreservingLength($comment);
-
- $comment_text = $comment->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<string> $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<int, string> $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<int, string> $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<int, string> $lines
- *
- * @return list<string>
- *
- * @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 d78bff9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php
+++ /dev/null
@@ -1,1454 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Exception\InvalidMethodOverrideException;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Internal\Scanner\FunctionDocblockComment;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\PossiblyInvalidDocblockTag;
-use Psalm\Storage\Assertion;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TAssertionFalsy;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\TaintKindGroup;
-use Psalm\Type\Union;
-
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-use function explode;
-use function in_array;
-use function preg_match;
-use function preg_replace;
-use function preg_split;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-use function trim;
-
-class FunctionLikeDocblockScanner
-{
- /**
- * @param array<string, non-empty-array<string, Union>> $existing_function_template_types
- * @param array<string, TypeAlias> $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<string, array<string, Union>> $template_types
- * @param array<string, TypeAlias>|null $type_aliases
- * @param array<string, array<string, Union>> $function_template_types
- *
- * @return array{
- * array<int, array{0: string, 1: int, 2?: string}>,
- * array<string, array<string, Union>>
- * }
- */
- 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<string, array<string, Union>> $class_template_types
- * @param array<string, array<string, Union>> $function_template_types
- * @param array<string, TypeAlias> $type_aliases
- * @return non-empty-list<string>|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<string, array<string, Union>> $class_template_types
- * @param array<string, non-empty-array<string, Union>> $function_template_types
- * @param array<string, TypeAlias> $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<string, TypeAlias> $type_aliases
- * @param array<string, non-empty-array<string, Union>> $function_template_types
- * @param array<string, non-empty-array<string, Union>> $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<string, TypeAlias> $type_aliases
- * @param array<string, non-empty-array<string, Union>> $function_template_types
- * @param array<string, non-empty-array<string, Union>> $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<string, TypeAlias> $type_aliases
- * @param array<string, non-empty-array<string, Union>> $function_template_types
- * @param array<string, non-empty-array<string, Union>> $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<string, TypeAlias> $type_aliases
- * @param array<string, array<string, Union>> $function_template_types
- * @param array<string, non-empty-array<string, Union>> $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<string, non-empty-array<string, Union>> $template_types
- * @param array<string, TypeAlias> $type_aliases
- * @return array<string, non-empty-array<string, Union>>
- */
- 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 cc10139..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php
+++ /dev/null
@@ -1,1151 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use LogicException;
-use PhpParser;
-use PhpParser\Node\Identifier;
-use PhpParser\Node\Name;
-use PhpParser\Node\NullableType;
-use PhpParser\Node\Stmt\Class_;
-use PhpParser\Node\UnionType;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Config;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\IncorrectDocblockException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\NamespaceAnalyzer;
-use Psalm\Internal\Analyzer\ScopeAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Issue\DuplicateFunction;
-use Psalm\Issue\DuplicateMethod;
-use Psalm\Issue\DuplicateParam;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\MissingDocblockType;
-use Psalm\Issue\ParseError;
-use Psalm\IssueBuffer;
-use Psalm\Storage\Assertion;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Storage\FunctionStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Storage\PropertyStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-use ReflectionFunction;
-use UnexpectedValueException;
-
-use function array_keys;
-use function array_merge;
-use function array_pop;
-use function array_search;
-use function count;
-use function end;
-use function explode;
-use function implode;
-use function in_array;
-use function is_string;
-use function spl_object_id;
-use function strpos;
-use function strtolower;
-
-class FunctionLikeNodeScanner
-{
- /**
- * @var FileScanner
- */
- private $file_scanner;
-
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * @var string
- */
- private $file_path;
-
- /**
- * @var Config
- */
- private $config;
-
- /**
- * @var FileStorage
- */
- private $file_storage;
-
- /**
- * @var ?ClassLikeStorage
- */
- private $classlike_storage;
-
- /**
- * @var array<string, non-empty-array<string, Union>>
- */
- private $existing_function_template_types;
-
- /**
- * @var Aliases
- */
- private $aliases;
-
- /**
- * @var array<string, TypeAlias>
- */
- private $type_aliases;
-
- /**
- * @var ?FunctionLikeStorage
- */
- public $storage;
-
- /**
- * @param array<string, non-empty-array<string, Union>> $existing_function_template_types
- * @param array<string, TypeAlias> $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 3dfb085..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor\Reflector;
-
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Codebase\Scanner as CodebaseScanner;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Storage\FileStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function implode;
-use function strtolower;
-
-class TypeHintResolver
-{
- /**
- * @param PhpParser\Node\Identifier|PhpParser\Node\Name|PhpParser\Node\NullableType|PhpParser\Node\UnionType $hint
- */
- public static function resolve(
- PhpParser\NodeAbstract $hint,
- CodebaseScanner $scanner,
- FileStorage $file_storage,
- ?ClassLikeStorage $classlike_storage,
- Aliases $aliases,
- int $php_major_version,
- int $php_minor_version
- ): Union {
- if ($hint instanceof PhpParser\Node\UnionType) {
- $type = null;
-
- if (!$hint->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 e99259c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php
+++ /dev/null
@@ -1,650 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use LogicException;
-use PhpParser;
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Exception\CodeException;
-use Psalm\Exception\DocblockParseException;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\FileSource;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\CommentAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\SimpleTypeInferer;
-use Psalm\Internal\EventDispatcher;
-use Psalm\Internal\PhpVisitor\Reflector\ClassLikeNodeScanner;
-use Psalm\Internal\PhpVisitor\Reflector\ExpressionResolver;
-use Psalm\Internal\PhpVisitor\Reflector\ExpressionScanner;
-use Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Internal\Scanner\PhpStormMetaScanner;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\TaintedInput;
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeVisitEvent;
-use Psalm\Storage\FileStorage;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type;
-use UnexpectedValueException;
-
-use function array_pop;
-use function end;
-use function explode;
-use function get_class;
-use function implode;
-use function in_array;
-use function is_string;
-use function reset;
-use function spl_object_id;
-use function strpos;
-use function strtolower;
-
-use const PHP_VERSION_ID;
-
-/**
- * @internal
- */
-class ReflectorVisitor extends PhpParser\NodeVisitorAbstract implements FileSource
-{
- /**
- * @var Aliases
- */
- private $aliases;
-
- /**
- * @var FileScanner
- */
- private $file_scanner;
-
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * @var string
- */
- private $file_path;
-
- /**
- * @var bool
- */
- private $scan_deep;
-
- /**
- * @var FileStorage
- */
- private $file_storage;
-
- /**
- * @var array<FunctionLikeNodeScanner>
- */
- private $functionlike_node_scanners = [];
-
- /**
- * @var array<ClassLikeNodeScanner>
- */
- 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<string, TypeAlias>
- */
- private $type_aliases = [];
-
- /**
- * @var array<int, bool>
- */
- 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 e0ed99d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-
-use function is_string;
-
-/**
- * @internal
- */
-class ShortClosureVisitor extends PhpParser\NodeVisitorAbstract
-{
- /**
- * @var array<string, bool>
- */
- 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<string, bool>
- */
- 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 38b14e5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-
-// based on PhpParser's builtin one
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use PhpParser\ErrorHandler;
-use PhpParser\NameContext;
-use PhpParser\Node;
-use PhpParser\Node\Expr;
-use PhpParser\Node\Name;
-use PhpParser\Node\NullableType;
-use PhpParser\Node\Stmt;
-use PhpParser\NodeVisitorAbstract;
-
-/**
- * @internal
- */
-class SimpleNameResolver extends NodeVisitorAbstract
-{
- /** @var NameContext Naming context */
- private $nameContext;
-
- /** @var int|null */
- private $start_change;
-
- /** @var int|null */
- private $end_change;
-
- /**
- * @param ErrorHandler $errorHandler Error handler
- * @param null|array<int, array{int, int, int, int, int, string}> $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 93a0522..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TraitFinder.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser;
-use ReflectionClass;
-use Throwable;
-
-use function count;
-use function end;
-use function explode;
-use function trait_exists;
-
-/**
- * Given a list of file diffs, this scans an AST to find the sections it can replace, and parses
- * just those methods.
- */
-class TraitFinder extends PhpParser\NodeVisitorAbstract
-{
- /** @var list<PhpParser\Node\Stmt\Trait_> */
- 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 05704e1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\PhpVisitor;
-
-use PhpParser\Node;
-use PhpParser\NodeVisitorAbstract;
-use Psalm\Internal\Provider\NodeDataProvider;
-
-class TypeMappingVisitor extends NodeVisitorAbstract
-{
- private $fake_type_provider;
- private $real_type_provider;
-
- public function __construct(
- NodeDataProvider $fake_type_provider,
- NodeDataProvider $real_type_provider
- ) {
- $this->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 ae05fb4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/DisableCommand.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager\Command;
-
-use InvalidArgumentException;
-use Psalm\Internal\PluginManager\PluginListFactory;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Style\SymfonyStyle;
-use UnexpectedValueException;
-
-use function assert;
-use function getcwd;
-use function is_string;
-
-use const DIRECTORY_SEPARATOR;
-
-/**
- * @internal
- */
-class DisableCommand extends Command
-{
- /** @var PluginListFactory */
- private $plugin_list_factory;
-
- public function __construct(PluginListFactory $plugin_list_factory)
- {
- $this->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 d868ca1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/EnableCommand.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager\Command;
-
-use InvalidArgumentException;
-use Psalm\Internal\PluginManager\PluginListFactory;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Style\SymfonyStyle;
-use UnexpectedValueException;
-
-use function assert;
-use function getcwd;
-use function is_string;
-
-use const DIRECTORY_SEPARATOR;
-
-/**
- * @internal
- */
-class EnableCommand extends Command
-{
- /** @var PluginListFactory */
- private $plugin_list_factory;
-
- public function __construct(PluginListFactory $plugin_list_factory)
- {
- $this->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 1ef6165..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/Command/ShowCommand.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager\Command;
-
-use Psalm\Internal\PluginManager\PluginListFactory;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Style\SymfonyStyle;
-use UnexpectedValueException;
-
-use function array_keys;
-use function array_map;
-use function array_values;
-use function count;
-use function getcwd;
-use function is_string;
-
-use const DIRECTORY_SEPARATOR;
-
-/**
- * @internal
- */
-class ShowCommand extends Command
-{
- /** @var PluginListFactory */
- private $plugin_list_factory;
-
- public function __construct(PluginListFactory $plugin_list_factory)
- {
- $this->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 fd5d251..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ComposerLock.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager;
-
-use RuntimeException;
-
-use function array_merge;
-use function file_get_contents;
-use function is_array;
-use function is_string;
-use function json_decode;
-use function json_last_error;
-use function json_last_error_msg;
-
-class ComposerLock
-{
- /** @var string[] */
- private $file_names;
-
- /** @param string[] $file_names */
- public function __construct(array $file_names)
- {
- $this->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<string,string> [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<array{name:string,extra:array{psalm:array{pluginClass:string}}}>
- */
- 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 a945dd2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/ConfigFile.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager;
-
-use DOMDocument;
-use DomElement;
-use Psalm\Config;
-use RuntimeException;
-
-use function assert;
-use function file_get_contents;
-use function file_put_contents;
-use function sprintf;
-use function strpos;
-use function substr;
-
-class ConfigFile
-{
- /** @var string */
- private $path;
-
- /** @var string */
- private $current_dir;
-
- /** @var string|null */
- private $psalm_header;
-
- /** @var int|null */
- private $psalm_tag_end_pos;
-
- public function __construct(string $current_dir, ?string $explicit_path)
- {
- $this->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, '<psalm')) !== false) {
- $tag_end = 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, '<psalm')) !== false) {
- $tag_end = 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 7f5d905..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginList.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager;
-
-use InvalidArgumentException;
-use RuntimeException;
-
-use function array_diff_key;
-use function array_flip;
-use function array_key_exists;
-use function array_search;
-use function strpos;
-
-class PluginList
-{
- /** @var null|ConfigFile */
- private $config_file;
-
- /** @var ComposerLock */
- private $composer_lock;
-
- /** @var ?array<string,string> [pluginClass => packageName] */
- private $all_plugins;
-
- /** @var ?array<string,?string> [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<string,?string> [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<string,?string> [pluginCLass => ?packageName]
- */
- public function getAvailable(): array
- {
- return array_diff_key($this->getAll(), $this->getEnabled());
- }
-
- /**
- * @return array<string,string> [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 0683365..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/PluginManager/PluginListFactory.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace Psalm\Internal\PluginManager;
-
-use Psalm\Internal\Composer;
-use RuntimeException;
-
-use function array_filter;
-use function json_encode;
-use function rtrim;
-use function urlencode;
-
-use const DIRECTORY_SEPARATOR;
-
-class PluginListFactory
-{
- /** @var string */
- private $project_root;
-
- /** @var string */
- private $psalm_root;
-
- public function __construct(string $project_root, string $psalm_root)
- {
- $this->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<int,string> */
- 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 d3328a5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\AddRemoveTaints;
-
-use PhpParser;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\AddTaintsInterface;
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-use Psalm\Plugin\EventHandler\RemoveTaintsInterface;
-
-use function count;
-use function strtolower;
-
-use const ENT_QUOTES;
-
-class HtmlFunctionTainter implements AddTaintsInterface, RemoveTaintsInterface
-{
- /**
- * Called to see what taints should be added
- *
- * @return list<string>
- */
- 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<string>
- */
- 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 dae227f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php
+++ /dev/null
@@ -1,182 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Psalm\Config;
-use Psalm\Storage\ClassLikeStorage;
-use UnexpectedValueException;
-
-use function array_merge;
-use function dirname;
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function filemtime;
-use function get_class;
-use function hash;
-use function igbinary_serialize;
-use function igbinary_unserialize;
-use function is_dir;
-use function is_null;
-use function mkdir;
-use function serialize;
-use function strtolower;
-use function unlink;
-use function unserialize;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_VERSION_ID;
-
-/**
- * @internal
- */
-class ClassLikeStorageCacheProvider
-{
- /**
- * @var Config
- */
- private $config;
-
- /**
- * @var string
- */
- private $modified_timestamps = '';
-
- private const CLASS_CACHE_DIRECTORY = 'class_cache';
-
- public function __construct(Config $config)
- {
- $this->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 bedf9b6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use InvalidArgumentException;
-use LogicException;
-use Psalm\Storage\ClassLikeStorage;
-
-use function array_merge;
-use function strtolower;
-
-/**
- * @internal
- */
-class ClassLikeStorageProvider
-{
- /**
- * Storing this statically is much faster (at least in PHP 7.2.1)
- *
- * @var array<string, ClassLikeStorage>
- */
- private static $storage = [];
-
- /**
- * @var array<string, ClassLikeStorage>
- */
- 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<string, ClassLikeStorage>
- */
- public function getAll(): array
- {
- return self::$storage;
- }
-
- /**
- * @return array<string, ClassLikeStorage>
- */
- public function getNew(): array
- {
- return self::$new_storage;
- }
-
- /**
- * @param array<string, ClassLikeStorage> $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 a94071a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FakeFileProvider.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use function microtime;
-use function strpos;
-
-class FakeFileProvider extends FileProvider
-{
- /**
- * @var array<string, string>
- */
- public $fake_files = [];
-
- /**
- * @var array<string, int>
- */
- 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<string> $file_extensions
- * @param null|callable(string):bool $filter
- *
- * @return list<string>
- */
- 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 66d5aad..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileProvider.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use FilesystemIterator;
-use RecursiveCallbackFilterIterator;
-use RecursiveDirectoryIterator;
-use RecursiveIterator;
-use RecursiveIteratorIterator;
-use UnexpectedValueException;
-
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function filemtime;
-use function in_array;
-use function is_dir;
-
-use const DIRECTORY_SEPARATOR;
-
-class FileProvider
-{
- /**
- * @var array<string, string>
- */
- protected $temp_files = [];
-
- /**
- * @var array<string, string>
- */
- 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<string> $file_extensions
- * @param null|callable(string):bool $filter
- *
- * @return list<string>
- */
- 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 616a1c2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php
+++ /dev/null
@@ -1,1007 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Psalm\Config;
-use Psalm\Internal\Codebase\Analyzer;
-use UnexpectedValueException;
-
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function igbinary_serialize;
-use function igbinary_unserialize;
-use function is_array;
-use function is_readable;
-use function mkdir;
-use function serialize;
-use function unserialize;
-
-use const DIRECTORY_SEPARATOR;
-
-/**
- * @psalm-import-type FileMapType from Analyzer
- *
- * Used to determine which files reference other files, necessary for using the --diff
- * option from the command line.
- */
-class FileReferenceCacheProvider
-{
- private const REFERENCE_CACHE_NAME = 'references';
- private const CLASSLIKE_FILE_CACHE_NAME = 'classlike_files';
- private const NONMETHOD_CLASS_REFERENCE_CACHE_NAME = 'file_class_references';
- private const METHOD_CLASS_REFERENCE_CACHE_NAME = 'method_class_references';
- private const ANALYZED_METHODS_CACHE_NAME = 'analyzed_methods';
- private const CLASS_METHOD_CACHE_NAME = 'class_method_references';
- private const METHOD_DEPENDENCIES_CACHE_NAME = 'class_method_dependencies';
- private const CLASS_PROPERTY_CACHE_NAME = 'class_property_references';
- private const CLASS_METHOD_RETURN_CACHE_NAME = 'class_method_return_references';
- private const FILE_METHOD_RETURN_CACHE_NAME = 'file_method_return_references';
- private const FILE_CLASS_MEMBER_CACHE_NAME = 'file_class_member_references';
- private const FILE_CLASS_PROPERTY_CACHE_NAME = 'file_class_property_references';
- private const ISSUES_CACHE_NAME = 'issues';
- private const FILE_MAPS_CACHE_NAME = 'file_maps';
- private const TYPE_COVERAGE_CACHE_NAME = 'type_coverage';
- private const CONFIG_HASH_CACHE_NAME = 'config';
- private const METHOD_MISSING_MEMBER_CACHE_NAME = 'method_missing_member';
- private const FILE_MISSING_MEMBER_CACHE_NAME = 'file_missing_member';
- private const UNKNOWN_MEMBER_CACHE_NAME = 'unknown_member_references';
- private const METHOD_PARAM_USE_CACHE_NAME = 'method_param_uses';
-
- /**
- * @var Config
- */
- protected $config;
-
- public function __construct(Config $config)
- {
- $this->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<string, array<string, int>>|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<string, array<string, int>> */
- return igbinary_unserialize(file_get_contents($analyzed_methods_cache_location));
- } else {
- /** @var array<string, array<string, int>> */
- return unserialize(file_get_contents($analyzed_methods_cache_location));
- }
- }
-
- return false;
- }
-
- /**
- * @param array<string, array<string, int>> $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<string, FileMapType>|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<string, FileMapType>
- */
- $file_maps_cache = igbinary_unserialize(file_get_contents($file_maps_cache_location));
- } else {
- /**
- * @var array<string, FileMapType>
- */
- $file_maps_cache = unserialize(file_get_contents($file_maps_cache_location));
- }
-
- return $file_maps_cache;
- }
-
- return false;
- }
-
- /**
- * @param array<string, FileMapType> $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<string, array{int, int}>|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<string, array{int, int}> */
- $type_coverage_cache = igbinary_unserialize(file_get_contents($type_coverage_cache_location));
- } else {
- /** @var array<string, array{int, int}> */
- $type_coverage_cache = unserialize(file_get_contents($type_coverage_cache_location));
- }
-
- return $type_coverage_cache;
- }
-
- return false;
- }
-
- /**
- * @param array<string, array{int, int}> $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 431726c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileReferenceProvider.php
+++ /dev/null
@@ -1,1320 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Codebase\Analyzer;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_keys;
-use function array_merge;
-use function array_unique;
-use function explode;
-use function file_exists;
-
-/**
- * @psalm-import-type FileMapType from Analyzer
- *
- * Used to determine which files reference other files, necessary for using the --diff
- * option from the command line.
- */
-class FileReferenceProvider
-{
- /**
- * @var bool
- */
- private $loaded_from_cache = false;
-
- /**
- * A lookup table used for getting all the references to a class not inside a method
- * indexed by file
- *
- * @var array<string, array<string,bool>>
- */
- private static $nonmethod_references_to_classes = [];
-
- /**
- * A lookup table used for getting all the methods that reference a class
- *
- * @var array<string, array<string,bool>>
- */
- private static $method_references_to_classes = [];
-
- /**
- * A lookup table used for getting all the files that reference a class member
- *
- * @var array<string, array<string,bool>>
- */
- private static $file_references_to_class_members = [];
-
- /**
- * A lookup table used for getting all the files that reference a class property
- *
- * @var array<string, array<string,bool>>
- */
- 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<string, array<string,bool>>
- */
- private static $file_references_to_method_returns = [];
-
- /**
- * A lookup table used for getting all the files that reference a missing class member
- *
- * @var array<string, array<string,bool>>
- */
- private static $file_references_to_missing_class_members = [];
-
- /**
- * @var array<string, array<string, true>>
- */
- private static $files_inheriting_classes = [];
-
- /**
- * A list of all files deleted since the last successful run
- *
- * @var array<int, string>|null
- */
- private static $deleted_files;
-
- /**
- * A lookup table used for getting all the files referenced by a file
- *
- * @var array<string, array{a:array<int, string>, i:array<int, string>}>
- */
- private static $file_references = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $method_references_to_class_members = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $method_dependencies = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $method_references_to_class_properties = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $method_references_to_method_returns = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $method_references_to_missing_class_members = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private static $references_to_mixed_member_names = [];
-
- /**
- * @var array<string, array<int, CodeLocation>>
- */
- private static $class_method_locations = [];
-
- /**
- * @var array<string, array<int, CodeLocation>>
- */
- private static $class_property_locations = [];
-
- /**
- * @var array<string, array<int, CodeLocation>>
- */
- private static $class_locations = [];
-
- /**
- * @var array<string, string>
- */
- private static $classlike_files = [];
-
- /**
- * @var array<string, array<string, int>>
- */
- private static $analyzed_methods = [];
-
- /**
- * @var array<string, array<int, IssueData>>
- */
- private static $issues = [];
-
- /**
- * @var array<string, FileMapType>
- */
- private static $file_maps = [];
-
- /**
- * @var array<string, array{int, int}>
- */
- private static $mixed_counts = [];
-
- /**
- * @var array<string, array<int, array<string, bool>>>
- */
- private static $method_param_uses = [];
-
- /**
- * @var ?FileReferenceCacheProvider
- */
- public $cache;
-
- public function __construct(?FileReferenceCacheProvider $cache = null)
- {
- $this->cache = $cache;
- }
-
- /**
- * @return array<int, string>
- */
- 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<string, array<string,bool>>
- */
- public function getAllNonMethodReferencesToClasses(): array
- {
- return self::$nonmethod_references_to_classes;
- }
-
- /**
- * @param array<string, array<string,bool>> $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<string, string> $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<string, array<string,bool>>
- */
- public function getAllFileReferencesToClassMembers(): array
- {
- return self::$file_references_to_class_members;
- }
-
- /**
- * @return array<string, array<string,bool>>
- */
- public function getAllFileReferencesToClassProperties(): array
- {
- return self::$file_references_to_class_properties;
- }
-
- /**
- * @return array<string, array<string,bool>>
- */
- public function getAllFileReferencesToMethodReturns(): array
- {
- return self::$file_references_to_method_returns;
- }
-
- /**
- * @return array<string, array<string,bool>>
- */
- public function getAllFileReferencesToMissingClassMembers(): array
- {
- return self::$file_references_to_missing_class_members;
- }
-
- /**
- * @param array<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<int, string>
- */
- 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<int, string>
- */
- 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<int, string>
- */
- public function getFilesReferencingFile(string $file): array
- {
- return self::$file_references[$file]['a'] ?? [];
- }
-
- /**
- * @return array<int, string>
- */
- public function getFilesInheritingFromFile(string $file): array
- {
- return self::$file_references[$file]['i'] ?? [];
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodReferencesToClassMembers(): array
- {
- return self::$method_references_to_class_members;
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodDependencies(): array
- {
- return self::$method_dependencies;
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodReferencesToClassProperties(): array
- {
- return self::$method_references_to_class_properties;
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodReferencesToMethodReturns(): array
- {
- return self::$method_references_to_method_returns;
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodReferencesToClasses(): array
- {
- return self::$method_references_to_classes;
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getAllMethodReferencesToMissingClassMembers(): array
- {
- return self::$method_references_to_missing_class_members;
- }
-
- /**
- * @return array<string, array<string,bool>>
- */
- public function getAllReferencesToMixedMemberNames(): array
- {
- return self::$references_to_mixed_member_names;
- }
-
- /**
- * @return array<string, array<int, array<string, bool>>>
- */
- 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<string, string|bool> $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<string, array<string,bool>> $references
- *
- */
- public function setNonMethodReferencesToClasses(array $references): void
- {
- self::$nonmethod_references_to_classes = $references;
- }
-
- /**
- * @return array<string, array<int, CodeLocation>>
- */
- public function getAllClassMethodLocations(): array
- {
- return self::$class_method_locations;
- }
-
- /**
- * @return array<string, array<int, CodeLocation>>
- */
- public function getAllClassPropertyLocations(): array
- {
- return self::$class_property_locations;
- }
-
- /**
- * @return array<string, array<int, CodeLocation>>
- */
- public function getAllClassLocations(): array
- {
- return self::$class_locations;
- }
-
- /**
- * @return array<int, CodeLocation>
- */
- public function getClassMethodLocations(string $method_id): array
- {
- return self::$class_method_locations[$method_id] ?? [];
- }
-
- /**
- * @return array<int, CodeLocation>
- */
- public function getClassPropertyLocations(string $property_id): array
- {
- return self::$class_property_locations[$property_id] ?? [];
- }
-
- /**
- * @return array<int, CodeLocation>
- */
- public function getClassLocations(string $fq_class_name_lc): array
- {
- return self::$class_locations[$fq_class_name_lc] ?? [];
- }
-
- /**
- * @param array<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<string,bool>> $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<string, array<int, array<string, bool>>> $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<string, array<string,bool>> $references
- *
- */
- public function setCallingMethodReferencesToClasses(array $references): void
- {
- self::$method_references_to_classes = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setCallingMethodReferencesToClassMembers(array $references): void
- {
- self::$method_references_to_class_members = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setMethodDependencies(array $references): void
- {
- self::$method_dependencies = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setCallingMethodReferencesToClassProperties(array $references): void
- {
- self::$method_references_to_class_properties = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setCallingMethodReferencesToMethodReturns(array $references): void
- {
- self::$method_references_to_method_returns = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setCallingMethodReferencesToMissingClassMembers(array $references): void
- {
- self::$method_references_to_missing_class_members = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setFileReferencesToClassMembers(array $references): void
- {
- self::$file_references_to_class_members = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setFileReferencesToClassProperties(array $references): void
- {
- self::$file_references_to_class_properties = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setFileReferencesToMethodReturns(array $references): void
- {
- self::$file_references_to_method_returns = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setFileReferencesToMissingClassMembers(array $references): void
- {
- self::$file_references_to_missing_class_members = $references;
- }
-
- /**
- * @param array<string, array<string,bool>> $references
- *
- */
- public function setReferencesToMixedMemberNames(array $references): void
- {
- self::$references_to_mixed_member_names = $references;
- }
-
- /**
- * @param array<string, array<int, array<string, bool>>> $references
- *
- */
- public function setMethodParamUses(array $references): void
- {
- self::$method_param_uses = $references;
- }
-
- /**
- * @param array<string, array<int, CodeLocation>> $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<string, array<int, CodeLocation>> $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<string, array<int, CodeLocation>> $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<string, array<int, IssueData>>
- */
- 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<string, array<string, int>> $analyzed_methods
- *
- */
- public function setAnalyzedMethods(array $analyzed_methods): void
- {
- self::$analyzed_methods = $analyzed_methods;
- }
-
- /**
- * @param array<string, FileMapType> $file_maps
- */
- public function setFileMaps(array $file_maps): void
- {
- self::$file_maps = $file_maps;
- }
-
- /**
- * @return array<string, array{int, int}>
- */
- public function getTypeCoverage(): array
- {
- return self::$mixed_counts;
- }
-
- /**
- * @param array<string, array{int, int}> $mixed_counts
- *
- */
- public function setTypeCoverage(array $mixed_counts): void
- {
- self::$mixed_counts = array_merge(self::$mixed_counts, $mixed_counts);
- }
-
- /**
- * @return array<string, array<string, int>>
- */
- public function getAnalyzedMethods(): array
- {
- return self::$analyzed_methods;
- }
-
- /**
- * @return array<string, FileMapType>
- */
- 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 d52b416..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageCacheProvider.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Psalm\Config;
-use Psalm\Storage\FileStorage;
-use UnexpectedValueException;
-
-use function array_merge;
-use function dirname;
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function filemtime;
-use function get_class;
-use function hash;
-use function igbinary_serialize;
-use function igbinary_unserialize;
-use function is_dir;
-use function mkdir;
-use function serialize;
-use function strtolower;
-use function unlink;
-use function unserialize;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_VERSION_ID;
-
-/**
- * @internal
- */
-class FileStorageCacheProvider
-{
- /**
- * @var string
- */
- private $modified_timestamps = '';
-
- /**
- * @var Config
- */
- private $config;
-
- private const FILE_STORAGE_CACHE_DIRECTORY = 'file_cache';
-
- public function __construct(Config $config)
- {
- $this->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 ff48840..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FileStorageProvider.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use InvalidArgumentException;
-use Psalm\Storage\FileStorage;
-
-use function array_merge;
-use function strtolower;
-
-/**
- * @internal
- */
-class FileStorageProvider
-{
- /**
- * A list of data useful to analyse files
- * Storing this statically is much faster (at least in PHP 7.2.1)
- *
- * @var array<lowercase-string, FileStorage>
- */
- 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<string, FileStorage>
- */
- 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<lowercase-string, FileStorage>
- */
- public function getAll(): array
- {
- return self::$storage;
- }
-
- /**
- * @return array<string, FileStorage>
- */
- public function getNew(): array
- {
- return self::$new_storage;
- }
-
- /**
- * @param array<lowercase-string, FileStorage> $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 57c4a8c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionExistenceProvider.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\Plugin\EventHandler\Event\FunctionExistenceProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionExistenceProviderInterface;
-use Psalm\Plugin\Hook\FunctionExistenceProviderInterface as LegacyFunctionExistenceProviderInterface;
-use Psalm\StatementsSource;
-
-use function is_subclass_of;
-use function strtolower;
-
-class FunctionExistenceProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(FunctionExistenceProviderEvent): ?bool>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * string
- * ): ?bool>
- * >
- */
- 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 d6b70c4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionParamsProvider.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Plugin\EventHandler\Event\FunctionParamsProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionParamsProviderInterface;
-use Psalm\Plugin\Hook\FunctionParamsProviderInterface as LegacyFunctionParamsProviderInterface;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeParameter;
-
-use function is_subclass_of;
-use function strtolower;
-
-class FunctionParamsProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(FunctionParamsProviderEvent): ?array<int, FunctionLikeParameter>>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * string,
- * list<Arg>,
- * ?Context=,
- * ?CodeLocation=
- * ): ?array<int, FunctionLikeParameter>>
- * >
- */
- private static $legacy_handlers = [];
-
- public function __construct()
- {
- self::$handlers = [];
- self::$legacy_handlers = [];
- }
-
- /**
- * @param class-string<LegacyFunctionParamsProviderInterface>|class-string<FunctionParamsProviderInterface> $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<int, FunctionLikeParameter> $c
- */
- public function registerClosure(string $fq_classlike_name, Closure $c): void
- {
- self::$handlers[strtolower($fq_classlike_name)][] = $c;
- }
-
- /**
- * @param Closure(
- * StatementsSource,
- * string,
- * list<Arg>,
- * ?Context=,
- * ?CodeLocation=
- * ): ?array<int, FunctionLikeParameter> $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<Arg> $call_args
- *
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 8b124ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php
+++ /dev/null
@@ -1,205 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use PhpParser;
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayChunkReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayColumnReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayFillReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayFilterReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayMapReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayMergeReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayPadReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayPointerAdjustmentReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayPopReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayRandReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayReduceReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayReverseReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArraySliceReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArraySpliceReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayUniqueReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ArrayValuesReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ExplodeReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\FilterVarReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\FirstArgStringReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\GetClassMethodsReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\GetObjectVarsReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\HexdecReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\InArrayReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\IteratorToArrayReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\MinMaxReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\MktimeReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\ParseUrlReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\RandReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\StrReplaceReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\StrTrReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\TriggerErrorReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\VersionCompareReturnTypeProvider;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Plugin\Hook\FunctionReturnTypeProviderInterface as LegacyFunctionReturnTypeProviderInterface;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-use function is_subclass_of;
-use function strtolower;
-
-class FunctionReturnTypeProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(FunctionReturnTypeProviderEvent): ?Union>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * non-empty-string,
- * list<Arg>,
- * 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<Arg>,
- * 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 0f63772..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodExistenceProvider.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\CodeLocation;
-use Psalm\Plugin\EventHandler\Event\MethodExistenceProviderEvent;
-use Psalm\Plugin\EventHandler\MethodExistenceProviderInterface;
-use Psalm\Plugin\Hook\MethodExistenceProviderInterface as LegacyMethodExistenceProviderInterface;
-use Psalm\StatementsSource;
-
-use function is_subclass_of;
-use function strtolower;
-
-class MethodExistenceProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(MethodExistenceProviderEvent): ?bool>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * string,
- * string,
- * ?StatementsSource=,
- * ?CodeLocation
- * ): ?bool>
- * >
- */
- private static $legacy_handlers = [];
-
- public function __construct()
- {
- self::$handlers = [];
- self::$legacy_handlers = [];
- }
-
- /**
- * @param class-string<LegacyMethodExistenceProviderInterface>|class-string<MethodExistenceProviderInterface> $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 0033a1e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodParamsProvider.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Provider\ReturnTypeProvider\PdoStatementSetFetchMode;
-use Psalm\Plugin\EventHandler\Event\MethodParamsProviderEvent;
-use Psalm\Plugin\EventHandler\MethodParamsProviderInterface;
-use Psalm\Plugin\Hook\MethodParamsProviderInterface as LegacyMethodParamsProviderInterface;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeParameter;
-
-use function array_values;
-use function is_subclass_of;
-use function strtolower;
-
-class MethodParamsProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(MethodParamsProviderEvent): ?array<int, FunctionLikeParameter>>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * string,
- * string,
- * ?list<Arg>=,
- * ?StatementsSource=,
- * ?Context=,
- * ?CodeLocation=
- * ): ?array<int, FunctionLikeParameter>>
- * >
- */
- 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<int, FunctionLikeParameter> $c
- */
- public function registerClosure(string $fq_classlike_name, Closure $c): void
- {
- self::$handlers[strtolower($fq_classlike_name)][] = $c;
- }
-
- /**
- * @param Closure(
- * string,
- * string,
- * ?list<Arg>=,
- * ?StatementsSource=,
- * ?Context=,
- * ?CodeLocation=
- * ): ?array<int, FunctionLikeParameter> $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<Arg> $call_args
- *
- * @return ?list<FunctionLikeParameter>
- */
- 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 f29dc77..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Provider\ReturnTypeProvider\ClosureFromCallableReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\DomNodeAppendChild;
-use Psalm\Internal\Provider\ReturnTypeProvider\ImagickPixelColorReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\PdoStatementReturnTypeProvider;
-use Psalm\Internal\Provider\ReturnTypeProvider\SimpleXmlElementAsXml;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Plugin\Hook\MethodReturnTypeProviderInterface as LegacyMethodReturnTypeProviderInterface;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-use function is_subclass_of;
-use function strtolower;
-
-class MethodReturnTypeProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(MethodReturnTypeProviderEvent): ?Union>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * string,
- * lowercase-string,
- * list<PhpParser\Node\Arg>,
- * Context,
- * CodeLocation,
- * ?array<Union>=,
- * ?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<PhpParser\Node\Arg>,
- * Context,
- * CodeLocation,
- * ?array<Union>=,
- * ?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<Union> $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 e9a876b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/MethodVisibilityProvider.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Plugin\EventHandler\Event\MethodVisibilityProviderEvent;
-use Psalm\Plugin\EventHandler\MethodVisibilityProviderInterface;
-use Psalm\Plugin\Hook\MethodVisibilityProviderInterface as LegacyMethodVisibilityProviderInterface;
-use Psalm\StatementsSource;
-
-use function is_subclass_of;
-use function strtolower;
-
-class MethodVisibilityProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(MethodVisibilityProviderEvent): ?bool>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * string,
- * string,
- * Context,
- * ?CodeLocation
- * ): ?bool>
- * >
- */
- private static $legacy_handlers = [];
-
- public function __construct()
- {
- self::$handlers = [];
- self::$legacy_handlers = [];
- }
-
- /**
- * @param class-string<LegacyMethodVisibilityProviderInterface>
- * |class-string<MethodVisibilityProviderInterface> $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 3987a23..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/NodeDataProvider.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use PhpParser\Node;
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\FuncCall;
-use PhpParser\Node\Expr\MethodCall;
-use PhpParser\Node\Expr\New_;
-use PhpParser\Node\Expr\StaticCall;
-use PhpParser\Node\Name;
-use PhpParser\Node\Stmt\Return_;
-use PhpParser\NodeAbstract;
-use Psalm\NodeTypeProvider;
-use Psalm\Storage\Assertion;
-use Psalm\Type\Union;
-use SplObjectStorage;
-
-class NodeDataProvider implements NodeTypeProvider
-{
- /** @var SplObjectStorage<Node, Union> */
- private $node_types;
-
- /**
- * @var SplObjectStorage<Node,list<non-empty-array<string, non-empty-list<non-empty-list<string>>>>|null>
- */
- private $node_assertions;
-
- /** @var SplObjectStorage<Node, array<int, Assertion>> */
- private $node_if_true_assertions;
-
- /** @var SplObjectStorage<Node, array<int, Assertion>> */
- 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<non-empty-array<string, non-empty-list<non-empty-list<string>>>>|null $assertions
- */
- public function setAssertions(Expr $node, ?array $assertions): void
- {
- if (!$this->cache_assertions) {
- return;
- }
-
- $this->node_assertions[$node] = $assertions;
- }
-
- /**
- * @return list<non-empty-array<string, non-empty-list<non-empty-list<string>>>>|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<int, Assertion> $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<int, Assertion>|null
- */
- public function getIfTrueAssertions(Expr $node): ?array
- {
- return $this->node_if_true_assertions[$node] ?? null;
- }
-
- /**
- * @param FuncCall|MethodCall|StaticCall|New_ $node
- * @param array<int, Assertion> $assertions
- */
- public function setIfFalseAssertions(Expr $node, array $assertions): void
- {
- $this->node_if_false_assertions[$node] = $assertions;
- }
-
- /**
- * @param FuncCall|MethodCall|StaticCall|New_ $node
- * @return array<int, Assertion>|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 a8f053f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ParserCacheProvider.php
+++ /dev/null
@@ -1,399 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use PhpParser;
-use PhpParser\Node\Stmt;
-use Psalm\Config;
-use RuntimeException;
-
-use function clearstatcache;
-use function error_log;
-use function fclose;
-use function file_get_contents;
-use function file_put_contents;
-use function filemtime;
-use function filesize;
-use function flock;
-use function fopen;
-use function fread;
-use function gettype;
-use function igbinary_serialize;
-use function igbinary_unserialize;
-use function is_array;
-use function is_dir;
-use function is_readable;
-use function is_writable;
-use function json_decode;
-use function json_encode;
-use function md5;
-use function mkdir;
-use function scandir;
-use function serialize;
-use function touch;
-use function unlink;
-use function unserialize;
-use function usleep;
-
-use const DIRECTORY_SEPARATOR;
-use const LOCK_EX;
-use const LOCK_SH;
-use const SCANDIR_SORT_NONE;
-
-/**
- * @internal
- */
-class ParserCacheProvider
-{
- private const FILE_HASHES = 'file_hashes_json';
- private const PARSER_CACHE_DIRECTORY = 'php-parser';
- private const FILE_CONTENTS_CACHE_DIRECTORY = 'file-caches';
-
- /**
- * A map of filename hashes to contents hashes
- *
- * @var array<string, string>|null
- */
- private $existing_file_content_hashes;
-
- /**
- * A map of recently-added filename hashes to contents hashes
- *
- * @var array<string, string>
- */
- 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<PhpParser\Node\Stmt>|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<Stmt> */
- $stmts = igbinary_unserialize((string)file_get_contents($cache_location));
- } else {
- /** @var list<Stmt> */
- $stmts = unserialize((string)file_get_contents($cache_location));
- }
-
- return $stmts;
- }
-
- return null;
- }
-
- /**
- * @return list<PhpParser\Node\Stmt>|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<Stmt> */
- return igbinary_unserialize((string)file_get_contents($cache_location)) ?: null;
- }
-
- /** @var list<Stmt> */
- 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<string, string>
- */
- 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<string, string> $hashes_decoded */
- $this->existing_file_content_hashes = $hashes_decoded;
- } else {
- $this->existing_file_content_hashes = [];
- }
- }
-
- return $this->existing_file_content_hashes;
- }
-
- /**
- * @param list<PhpParser\Node\Stmt> $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<string, string>
- */
- public function getNewFileContentHashes(): array
- {
- return $this->new_file_content_hashes;
- }
-
- /**
- * @param array<string, string> $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 5775577..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ProjectCacheProvider.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Psalm\Config;
-
-use function file_exists;
-use function file_get_contents;
-use function file_put_contents;
-use function filemtime;
-use function hash;
-use function mkdir;
-use function touch;
-
-use const DIRECTORY_SEPARATOR;
-use const PHP_VERSION_ID;
-
-/**
- * Used to determine which files reference other files, necessary for using the --diff
- * option from the command line.
- */
-class ProjectCacheProvider
-{
- private const GOOD_RUN_NAME = 'good_run';
- private const COMPOSER_LOCK_HASH = 'composer_lock_hash';
-
- /**
- * @var int|null
- */
- private $last_run;
-
- /**
- * @var string|null
- */
- private $composer_lock_hash;
-
- private $composer_lock_location;
-
- public function __construct(string $composer_lock_location)
- {
- $this->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 6af68fe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyExistenceProvider.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Plugin\EventHandler\Event\PropertyExistenceProviderEvent;
-use Psalm\Plugin\EventHandler\PropertyExistenceProviderInterface;
-use Psalm\Plugin\Hook\PropertyExistenceProviderInterface as LegacyPropertyExistenceProviderInterface;
-use Psalm\StatementsSource;
-
-use function is_subclass_of;
-use function strtolower;
-
-class PropertyExistenceProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(PropertyExistenceProviderEvent): ?bool>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * string,
- * string,
- * bool,
- * ?StatementsSource=,
- * ?Context=,
- * ?CodeLocation=
- * ): ?bool>
- * >
- */
- private static $legacy_handlers = [];
-
- public function __construct()
- {
- self::$handlers = [];
- self::$legacy_handlers = [];
- }
-
- /**
- * @param class-string<LegacyPropertyExistenceProviderInterface>
- * |class-string<PropertyExistenceProviderInterface> $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 2e3d1db..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider.php
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\Context;
-use Psalm\Internal\Provider\PropertyTypeProvider\DomDocumentPropertyTypeProvider;
-use Psalm\Plugin\EventHandler\Event\PropertyTypeProviderEvent;
-use Psalm\Plugin\EventHandler\PropertyTypeProviderInterface;
-use Psalm\Plugin\Hook\PropertyTypeProviderInterface as LegacyPropertyTypeProviderInterface;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-use function is_subclass_of;
-use function strtolower;
-
-class PropertyTypeProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(PropertyTypeProviderEvent): ?Union>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * string,
- * string,
- * bool,
- * ?StatementsSource=,
- * ?Context=
- * ): ?Union>
- * >
- */
- 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 2b12767..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\PropertyTypeProvider;
-
-use Psalm\Plugin\EventHandler\Event\PropertyTypeProviderEvent;
-use Psalm\Plugin\EventHandler\PropertyTypeProviderInterface;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-use function strtolower;
-
-class DomDocumentPropertyTypeProvider implements PropertyTypeProviderInterface
-{
- public static function getPropertyType(PropertyTypeProviderEvent $event): ?Union
- {
- if (strtolower($event->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 4ad5794..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use Closure;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Plugin\EventHandler\Event\PropertyVisibilityProviderEvent;
-use Psalm\Plugin\EventHandler\PropertyVisibilityProviderInterface;
-use Psalm\Plugin\Hook\PropertyVisibilityProviderInterface as LegacyPropertyVisibilityProviderInterface;
-use Psalm\StatementsSource;
-
-use function is_subclass_of;
-use function strtolower;
-
-class PropertyVisibilityProvider
-{
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(PropertyVisibilityProviderEvent): ?bool>
- * >
- */
- private static $handlers = [];
-
- /**
- * @var array<
- * lowercase-string,
- * array<Closure(
- * StatementsSource,
- * string,
- * string,
- * bool,
- * Context,
- * CodeLocation
- * ): ?bool>
- * >
- */
- private static $legacy_handlers = [];
-
- public function __construct()
- {
- self::$handlers = [];
- self::$legacy_handlers = [];
- }
-
- /**
- * @param class-string<LegacyPropertyVisibilityProviderInterface>
- * |class-string<PropertyVisibilityProviderInterface> $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 d42e100..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/Providers.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-/**
- * @internal
- */
-class Providers
-{
- /**
- * @var FileProvider
- */
- public $file_provider;
-
- /**
- * @var ?ParserCacheProvider
- */
- public $parser_cache_provider;
-
- /**
- * @var FileStorageProvider
- */
- public $file_storage_provider;
-
- /**
- * @var ClassLikeStorageProvider
- */
- public $classlike_storage_provider;
-
- /**
- * @var StatementsProvider
- */
- public $statements_provider;
-
- /**
- * @var FileReferenceProvider
- */
- public $file_reference_provider;
-
- /**
- * @var ?ProjectCacheProvider
- */
- public $project_cache_provider;
-
- public function __construct(
- FileProvider $file_provider,
- ?ParserCacheProvider $parser_cache_provider = null,
- ?FileStorageCacheProvider $file_storage_cache_provider = null,
- ?ClassLikeStorageCacheProvider $classlike_storage_cache_provider = null,
- ?FileReferenceCacheProvider $file_reference_cache_provider = null,
- ?ProjectCacheProvider $project_cache_provider = null
- ) {
- $this->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 8687709..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Type\ArrayType;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-use function count;
-
-class ArrayChunkReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 89e68a1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-use function count;
-use function reset;
-
-class ArrayColumnReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 9a16f98..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-class ArrayFillReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 b8612e1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php
+++ /dev/null
@@ -1,331 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Exception\ComplicatedExpressionException;
-use Psalm\Internal\Algebra;
-use Psalm\Internal\Algebra\FormulaGenerator;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\ExpressionIdentifier;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\AssertionReconciler;
-use Psalm\Issue\InvalidReturnType;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function array_filter;
-use function array_map;
-use function array_slice;
-use function count;
-use function is_string;
-use function mt_rand;
-use function reset;
-use function spl_object_id;
-
-class ArrayFilterReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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<PhpParser\Node\Stmt> */
- $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 47c786e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php
+++ /dev/null
@@ -1,499 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PhpParser;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\Statements\Expression\AssertionFinder;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\ArrayType;
-use Psalm\Node\Expr\VirtualArrayDimFetch;
-use Psalm\Node\Expr\VirtualFuncCall;
-use Psalm\Node\Expr\VirtualMethodCall;
-use Psalm\Node\Expr\VirtualStaticCall;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\VirtualArg;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_map;
-use function array_shift;
-use function array_slice;
-use function count;
-use function explode;
-use function in_array;
-use function mt_rand;
-use function reset;
-use function strpos;
-use function substr;
-
-class ArrayMapReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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<string, array<array<int, string>>>|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<int, string> $mapping_function_ids
- * @param list<PhpParser\Node\Arg> $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<string, array<array<int, string>>>|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 6102ba4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function array_values;
-use function count;
-use function is_string;
-use function max;
-use function mb_strcut;
-
-class ArrayMergeReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 f5859c1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Type\ArrayType;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-use function count;
-
-class ArrayPadReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 66d3952..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\ArrayFetchAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_shift;
-
-class ArrayPointerAdjustmentReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 25dd2bd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-class ArrayPopReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 8c7062b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PhpParser;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-class ArrayRandReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 a9d27ba..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php
+++ /dev/null
@@ -1,298 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\InvalidArgument;
-use Psalm\IssueBuffer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-use function count;
-use function explode;
-use function in_array;
-use function reset;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class ArrayReduceReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 0fab066..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-class ArrayReverseReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 399bb25..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_shift;
-
-class ArraySliceReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 6f4d062..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-class ArraySpliceReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 5499ad2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-class ArrayUniqueReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 0544510..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayValuesReturnTypeProvider.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_shift;
-
-class ArrayValuesReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 a94e581..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Union;
-
-class ClosureFromCallableReturnTypeProvider implements MethodReturnTypeProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['Closure'];
- }
-
- public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union
- {
- $source = $event->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 6d7723b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-class DomNodeAppendChild implements MethodReturnTypeProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['DomNode'];
- }
-
- public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union
- {
- $source = $event->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 81001ff..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ExplodeReturnTypeProvider.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PhpParser;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-
-use function count;
-
-class ExplodeReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 3ebc5e1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function in_array;
-
-use const FILTER_NULL_ON_FAILURE;
-use const FILTER_VALIDATE_BOOLEAN;
-use const FILTER_VALIDATE_DOMAIN;
-use const FILTER_VALIDATE_EMAIL;
-use const FILTER_VALIDATE_FLOAT;
-use const FILTER_VALIDATE_INT;
-use const FILTER_VALIDATE_IP;
-use const FILTER_VALIDATE_MAC;
-use const FILTER_VALIDATE_REGEXP;
-use const FILTER_VALIDATE_URL;
-
-class FilterVarReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 4f99fdd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-class FirstArgStringReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 4c7d786..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-class GetClassMethodsReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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<string>');
- }
-
- 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 cc8a43d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\Internal\Analyzer\ClassAnalyzer;
-use Psalm\Internal\Analyzer\SourceAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Union;
-use stdClass;
-
-use function reset;
-use function strtolower;
-
-class GetObjectVarsReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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<string, mixed>');
- }
- 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<string, mixed>');
- }
- $codebase = $statements_source->getCodebase();
- $class_storage = $codebase->classlikes->getStorageFor($object_type->value);
-
- if (null === $class_storage) {
- return Type::parseString('array<string, mixed>');
- }
-
- if ([] === $class_storage->appearing_property_ids) {
- if ($class_storage->final) {
- return Type::getEmptyArray();
- }
-
- return Type::parseString('array<string, mixed>');
- }
-
- $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<string, mixed>');
- }
-
- return new Union([
- new TKeyedArray($properties)
- ]);
- }
- }
- return Type::parseString('array<string, mixed>');
- }
-
- 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 b6c6078..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-class HexdecReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 c97048a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Union;
-
-use function assert;
-use function in_array;
-
-class ImagickPixelColorReturnTypeProvider implements MethodReturnTypeProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['imagickpixel'];
- }
-
- public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union
- {
- $source = $event->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 519984f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-class InArrayReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 52d2647..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\Statements\Block\ForeachAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function array_shift;
-use function assert;
-
-class IteratorToArrayReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 1a24e22..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Type\ArrayType;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function assert;
-use function count;
-use function get_class;
-use function in_array;
-use function max;
-use function min;
-
-class MinMaxReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 4b9ea03..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Union;
-
-class MktimeReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 6d51c7d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-
-use const PHP_URL_FRAGMENT;
-use const PHP_URL_HOST;
-use const PHP_URL_PASS;
-use const PHP_URL_PATH;
-use const PHP_URL_PORT;
-use const PHP_URL_QUERY;
-use const PHP_URL_SCHEME;
-use const PHP_URL_USER;
-
-class ParseUrlReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 86ee127..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PDO;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Union;
-
-use function class_exists;
-
-class PdoStatementReturnTypeProvider implements MethodReturnTypeProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['PDOStatement'];
- }
-
- public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union
- {
- $source = $event->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<string,scalar|null>|false
- return new Union([
- new TArray([
- Type::getString(),
- new Union([
- new TScalar(),
- new TNull()
- ])
- ]),
- new TFalse(),
- ]);
-
- case PDO::FETCH_BOTH: // array<array-key,scalar|null>|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<string, scalar|list<scalar>>|false
- return new Union([
- new TArray([
- Type::getString(),
- new Union([
- new TScalar(),
- new TList(Type::getScalar())
- ])
- ]),
- new TFalse(),
- ]);
-
- case PDO::FETCH_NUM: // list<scalar|null>|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 e352ffd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use PDO;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\MethodParamsProviderEvent;
-use Psalm\Plugin\EventHandler\MethodParamsProviderInterface;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-
-class PdoStatementSetFetchMode implements MethodParamsProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['PDOStatement'];
- }
-
- /**
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 32530db..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Union;
-
-use function count;
-
-class RandReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 88e71c3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-use function count;
-
-class SimpleXmlElementAsXml implements MethodReturnTypeProviderInterface
-{
- public static function getClassLikeNames(): array
- {
- return ['SimpleXMLElement'];
- }
-
- public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union
- {
- $call_args = $event->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 d32da31..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-use function count;
-use function in_array;
-
-class StrReplaceReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 cb3b019..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function in_array;
-
-class StrTrReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 385c6b6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Union;
-
-use function in_array;
-
-use const E_USER_DEPRECATED;
-use const E_USER_ERROR;
-use const E_USER_NOTICE;
-use const E_USER_WARNING;
-
-class TriggerErrorReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 cab2b99..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider\ReturnTypeProvider;
-
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Type;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Union;
-
-use function count;
-
-class VersionCompareReturnTypeProvider implements FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 431cb15..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsProvider.php
+++ /dev/null
@@ -1,538 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use PhpParser;
-use PhpParser\ErrorHandler\Collecting;
-use PhpParser\Node\Stmt;
-use Psalm\CodeLocation\ParseErrorLocation;
-use Psalm\Config;
-use Psalm\Internal\Diff\FileDiffer;
-use Psalm\Internal\Diff\FileStatementsDiffer;
-use Psalm\Internal\PhpTraverser\CustomTraverser;
-use Psalm\Internal\PhpVisitor\CloningVisitor;
-use Psalm\Internal\PhpVisitor\PartialParserVisitor;
-use Psalm\Internal\PhpVisitor\SimpleNameResolver;
-use Psalm\Issue\ParseError;
-use Psalm\IssueBuffer;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Throwable;
-
-use function abs;
-use function array_flip;
-use function array_intersect_key;
-use function array_map;
-use function array_merge;
-use function count;
-use function filemtime;
-use function md5;
-use function strlen;
-use function strpos;
-
-/**
- * @internal
- */
-class StatementsProvider
-{
- /**
- * @var FileProvider
- */
- private $file_provider;
-
- /**
- * @var ?ParserCacheProvider
- */
- public $parser_cache_provider;
-
- /**
- * @var int
- */
- private $this_modified_time;
-
- /**
- * @var ?FileStorageCacheProvider
- */
- private $file_storage_cache_provider;
-
- /**
- * @var StatementsVolatileCache
- */
- private $statements_volatile_cache;
-
- /**
- * @var array<string, array<string, bool>>
- */
- private $unchanged_members = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private $unchanged_signature_members = [];
-
- /**
- * @var array<string, array<string, bool>>
- */
- private $changed_members = [];
-
- /**
- * @var array<string, bool>
- */
- private $errors = [];
-
- /**
- * @var array<string, array<int, array{int, int, int, int}>>
- */
- private $diff_map = [];
-
- /**
- * @var array<string, array<int, array{int, int}>>
- */
- 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<Stmt>
- */
- 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<PhpParser\Node\Stmt> */
- $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<string, array<string, bool>>
- */
- public function getChangedMembers(): array
- {
- return $this->changed_members;
- }
-
- /**
- * @param array<string, array<string, bool>> $more_changed_members
- *
- */
- public function addChangedMembers(array $more_changed_members): void
- {
- $this->changed_members = array_merge($more_changed_members, $this->changed_members);
- }
-
- /**
- * @return array<string, array<string, bool>>
- */
- public function getUnchangedSignatureMembers(): array
- {
- return $this->unchanged_signature_members;
- }
-
- /**
- * @param array<string, array<string, bool>> $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<string, bool>
- */
- public function getErrors(): array
- {
- return $this->errors;
- }
-
- /**
- * @param array<string, bool> $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<string, array<int, array{int, int, int, int}>>
- */
- public function getDiffMap(): array
- {
- return $this->diff_map;
- }
-
- /**
- * @return array<string, array<int, array{int, int}>>
- */
- public function getDeletionRanges(): array
- {
- return $this->deletion_ranges;
- }
-
- /**
- * @param array<string, array<int, array{int, int, int, int}>> $diff_map
- *
- */
- public function addDiffMap(array $diff_map): void
- {
- $this->diff_map = array_merge($diff_map, $this->diff_map);
- }
-
- /**
- * @param array<string, array<int, array{int, int}>> $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<Stmt> $existing_statements
- * @param array<int, array{0:int, 1:int, 2: int, 3: int, 4: int, 5:string}> $file_changes
- *
- * @return list<Stmt>
- */
- 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<Stmt> */
- $stmts = self::$parser->parse($file_contents, $error_handler) ?: [];
- } catch (Throwable $t) {
- $stmts = [];
-
- // hope this got caught below
- }
- }
- } else {
- try {
- /** @var list<Stmt> */
- $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 2dd19ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Provider/StatementsVolatileCache.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Provider;
-
-use InvalidArgumentException;
-use PhpParser\Node\Stmt;
-
-use function array_key_exists;
-use function array_search;
-use function array_splice;
-use function count;
-use function is_null;
-use function key;
-use function reset;
-
-/**
- * @internal Owned by StatementsProvider
- * @todo: track variables size instead
- */
-final class StatementsVolatileCache
-{
- /**
- * @var array<string, list<Stmt>>
- */
- protected $cache = [];
-
- /**
- * @var array<int, string>
- */
- 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<Stmt>
- * @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<Stmt> $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 14bb170..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/ReferenceConstraint.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class ReferenceConstraint
-{
- /** @var Union|null */
- public $type;
-
- public function __construct(?Union $type = null)
- {
- if ($type) {
- $this->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 64c398d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/RuntimeCaches.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace Psalm\Internal;
-
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Analyzer\FunctionLikeAnalyzer;
-use Psalm\Internal\Codebase\Functions;
-use Psalm\Internal\Codebase\Reflection;
-use Psalm\Internal\FileManipulation\ClassDocblockManipulator;
-use Psalm\Internal\FileManipulation\FileManipulationBuffer;
-use Psalm\Internal\FileManipulation\FunctionDocblockManipulator;
-use Psalm\Internal\FileManipulation\PropertyDocblockManipulator;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileReferenceProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Internal\Provider\StatementsProvider;
-use Psalm\Internal\Provider\StatementsVolatileCache;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\IssueBuffer;
-
-abstract class RuntimeCaches
-{
- public static function clearAll(): void
- {
- IssueBuffer::clearCache();
- Reflection::clearCache();
- Functions::clearCache();
- TypeTokenizer::clearCache();
- FileReferenceProvider::clearCache();
- FileManipulationBuffer::clearCache();
- ClassDocblockManipulator::clearCache();
- FunctionDocblockManipulator::clearCache();
- PropertyDocblockManipulator::clearCache();
- FileAnalyzer::clearCache();
- FunctionLikeAnalyzer::clearCache();
- ClassLikeStorageProvider::deleteAll();
- FileStorageProvider::deleteAll();
- StatementsProvider::clearLexer();
- StatementsProvider::clearParser();
- ParsedDocblock::resetNewlineBetweenAnnotations();
- StatementsVolatileCache::getInstance()->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 a9168cc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use PhpParser\Node\Stmt\ClassMethod;
-
-/**
- * @internal
- */
-class ClassLikeDocblockComment
-{
- /**
- * Whether or not the class is deprecated
- *
- * @var bool
- */
- public $deprecated = false;
-
- /**
- * Whether or not the class is internal
- *
- * @var bool
- */
- public $internal = false;
-
- /**
- * Whether or not the class is final
- *
- * @var bool
- */
- public $final = false;
-
- /**
- * If set, the class is internal to the given namespace.
- *
- * @var list<non-empty-string>
- */
- public $psalm_internal = [];
-
- /**
- * @var string[]
- */
- public $mixins = [];
-
- /**
- * @var array<int, array{string, ?string, ?string, bool, int}>
- */
- public $templates = [];
-
- /**
- * @var array<int, string>
- */
- public $template_extends = [];
-
- /**
- * @var array<int, string>
- */
- public $template_implements = [];
-
- /**
- * @var ?string
- */
- public $yield;
-
- /**
- * @var array<int, array{name:string, type:string, tag:string, line_number:int}>
- */
- public $properties = [];
-
- /**
- * @var array<int, ClassMethod>
- */
- 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<int, string>
- */
- public $suppressed_issues = [];
-
- /**
- * @var list<array{line_number:int,start_offset:int,end_offset:int,parts:list<string>}>
- */
- 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<int, string>
- */
- 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 2ddf134..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/DocblockParser.php
+++ /dev/null
@@ -1,300 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use Psalm\Exception\DocblockParseException;
-
-use function array_filter;
-use function array_map;
-use function array_values;
-use function assert;
-use function count;
-use function explode;
-use function implode;
-use function is_string;
-use function min;
-use function preg_match;
-use function preg_replace;
-use function rtrim;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function strspn;
-use function substr;
-use function trim;
-
-use const PREG_OFFSET_CAPTURE;
-
-/**
- * This class will parse Docblocks in order to extract known tags from them
- */
-class DocblockParser
-{
- /**
- * $offsetStart is the absolute position of the docblock in the file. It'll be used to add to the position of some
- * special tags (like `psalm-suppress`) for future uses
- */
- public static function parse(string $docblock, int $offsetStart): ParsedDocblock
- {
- // Strip off comments.
- $docblock = trim($docblock);
-
- if (strpos($docblock, '/**') === 0) {
- $docblock = substr($docblock, 3);
- }
-
- if (substr($docblock, -2) === '*/') {
- $docblock = substr($docblock, 0, -2);
-
- if (substr($docblock, -1) === '*') {
- $docblock = substr($docblock, 0, -1);
- }
- }
-
- // Normalize multi-line @specials.
- $lines = explode("\n", $docblock);
-
- $special = [];
-
- $first_line_padding = null;
-
- $last = false;
- foreach ($lines as $k => $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<int, array{string, int}> $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<non-empty-string>
- * @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<array-key, non-empty-string> $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 1cc9b6f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use PhpParser;
-use PhpParser\NodeTraverser;
-use Psalm\Aliases;
-use Psalm\Codebase;
-use Psalm\FileSource;
-use Psalm\Internal\PhpVisitor\ReflectorVisitor;
-use Psalm\Progress\Progress;
-use Psalm\Progress\VoidProgress;
-use Psalm\Storage\FileStorage;
-
-/**
- * @internal
- * @psalm-consistent-constructor
- */
-class FileScanner implements FileSource
-{
- /**
- * @var string
- */
- public $file_path;
-
- /**
- * @var string
- */
- public $file_name;
-
- /**
- * @var bool
- */
- public $will_analyze;
-
- public function __construct(string $file_path, string $file_name, bool $will_analyze)
- {
- $this->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 a3819b4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FunctionDocblockComment.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-/**
- * @internal
- */
-class FunctionDocblockComment
-{
- /**
- * @var string|null
- */
- public $return_type;
-
- /**
- * @var string|null
- */
- public $return_type_description;
-
- /**
- * @var int|null
- */
- public $return_type_start;
-
- /**
- * @var int|null
- */
- public $return_type_end;
-
- /**
- * @var int|null
- */
- public $return_type_line_number;
-
- /**
- * @var array<
- * int,
- * array{
- * name:string,
- * type:string,
- * line_number: int,
- * start: int,
- * end: int,
- * description?: string
- * }
- * >
- */
- public $params = [];
-
- /**
- * @var array<int, array{name:string, type:string, line_number: int}>
- */
- 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<int, array{name:string, type:string, line_number: int}>
- */
- 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<non-empty-string>
- */
- 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<string>
- */
- public $flows = [];
-
- /**
- * @var array<string>
- */
- public $added_taints = [];
-
- /**
- * @var array<string>
- */
- public $removed_taints = [];
-
- /**
- * @var array<int, array{name:string, taint: string}>
- */
- public $taint_sink_params = [];
-
- /**
- * @var array<string>
- */
- public $taint_source_types = [];
-
- /**
- * @var array<int, array{name:string}>
- */
- 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<int, string>
- */
- public $suppressed_issues = [];
-
- /**
- * @var array<int, array{0: string, 1: int, 2: int}>
- */
- public $throws = [];
-
- /**
- * @var array<int, array{string, ?string, ?string, bool}>
- */
- public $templates = [];
-
- /**
- * @var array<int, array{type: string, param_name: string}>
- */
- public $assertions = [];
-
- /**
- * @var array<int, array{type: string, param_name: string}>
- */
- public $if_true_assertions = [];
-
- /**
- * @var array<int, array{type: string, param_name: string}>
- */
- 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<string, array{lines:list<int>, 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 26c5b01..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/ParsedDocblock.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use function explode;
-use function trim;
-
-class ParsedDocblock
-{
- /** @var string */
- public $description;
-
- /** @var string */
- public $first_line_padding;
-
- /** @var array<string, array<int, string>> */
- public $tags = [];
-
- /** @var array<string, array<int, string>> */
- public $combined_tags = [];
-
- /**
- * @var bool
- */
- private static $shouldAddNewLineBetweenAnnotations = true;
-
- /** @param array<string, array<int, string>> $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 c412736..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php
+++ /dev/null
@@ -1,398 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use PhpParser;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Union;
-
-use function count;
-use function implode;
-use function is_string;
-use function str_replace;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class PhpStormMetaScanner
-{
- /**
- * @param list<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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<PhpParser\Node\Arg> $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 fde6296..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class ArrayOffsetFetch extends UnresolvedConstantComponent
-{
- /** @var UnresolvedConstantComponent */
- public $array;
-
- /** @var UnresolvedConstantComponent */
- public $offset;
-
- public function __construct(UnresolvedConstantComponent $left, UnresolvedConstantComponent $right)
- {
- $this->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 1a1ec7b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class ArraySpread extends UnresolvedConstantComponent
-{
- /** @var UnresolvedConstantComponent */
- public $array;
-
- public function __construct(UnresolvedConstantComponent $array)
- {
- $this->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 e42888f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class ArrayValue extends UnresolvedConstantComponent
-{
- /** @var array<int, KeyValuePair|ArraySpread> */
- public $entries;
-
- /** @param list<KeyValuePair|ArraySpread> $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 7f789b9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class ClassConstant extends UnresolvedConstantComponent
-{
- /** @var string */
- public $fqcln;
-
- /** @var string */
- public $name;
-
- public function __construct(string $fqcln, string $name)
- {
- $this->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 a222fb0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class Constant extends UnresolvedConstantComponent
-{
- /** @var string */
- public $name;
-
- /** @var bool */
- public $is_fully_qualified;
-
- public function __construct(string $name, bool $is_fully_qualified)
- {
- $this->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 7ba4d8d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class KeyValuePair extends UnresolvedConstantComponent
-{
- /** @var ?UnresolvedConstantComponent */
- public $key;
-
- /** @var UnresolvedConstantComponent */
- public $value;
-
- public function __construct(?UnresolvedConstantComponent $key, UnresolvedConstantComponent $value)
- {
- $this->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 6fa9727..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class ScalarValue extends UnresolvedConstantComponent
-{
- /** @var string|int|float|bool|null */
- public $value;
-
- /** @param string|int|float|bool|null $value */
- public function __construct($value)
- {
- $this->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 90c2f9e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedAdditionOp extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php
deleted file mode 100644
index 3662cc6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-abstract class UnresolvedBinaryOp extends UnresolvedConstantComponent
-{
- /** @var UnresolvedConstantComponent */
- public $left;
-
- /** @var UnresolvedConstantComponent */
- public $right;
-
- public function __construct(UnresolvedConstantComponent $left, UnresolvedConstantComponent $right)
- {
- $this->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 c4fb77a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedBitwiseAnd extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php
deleted file mode 100644
index 751fc5e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedBitwiseOr extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php
deleted file mode 100644
index cf72dac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedBitwiseXor extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php
deleted file mode 100644
index 72c8718..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedConcatOp extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php
deleted file mode 100644
index b990265..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedDivisionOp extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php
deleted file mode 100644
index 76905bd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedMultiplicationOp extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php
deleted file mode 100644
index 76a06cc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedSubtractionOp extends UnresolvedBinaryOp
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php
deleted file mode 100644
index f9618f0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner\UnresolvedConstant;
-
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-
-/**
- * @psalm-immutable
- */
-class UnresolvedTernary extends UnresolvedConstantComponent
-{
- /** @var UnresolvedConstantComponent */
- public $cond;
- /** @var UnresolvedConstantComponent|null */
- public $if;
- /** @var UnresolvedConstantComponent */
- public $else;
-
- public function __construct(
- UnresolvedConstantComponent $cond,
- ?UnresolvedConstantComponent $if,
- UnresolvedConstantComponent $else
- ) {
- $this->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 5f96f7d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-/**
- * @psalm-immutable
- */
-abstract class UnresolvedConstantComponent
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php b/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php
deleted file mode 100644
index 8797530..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/VarDocblockComment.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scanner;
-
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class VarDocblockComment
-{
- /**
- * @var ?Union
- */
- public $type;
-
- /**
- * @var string|null
- */
- public $var_id;
-
- /**
- * @var int|null
- */
- public $line_number;
-
- /**
- * @var int|null
- */
- public $type_start;
-
- /**
- * @var int|null
- */
- public $type_end;
-
- /**
- * Whether or not the property is deprecated
- *
- * @var bool
- */
- public $deprecated = false;
-
- /**
- * Whether or not the property is internal
- *
- * @var bool
- */
- public $internal = false;
-
- /**
- * If set, the property is internal to the given namespace.
- *
- * @var list<non-empty-string>
- */
- 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<string>
- */
- public $removed_taints = [];
-
- /**
- * @var array<int, string>
- */
- 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 a7ce48e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/CaseScope.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use Psalm\Context;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class CaseScope
-{
- /**
- * @var Context
- */
- public $parent_context;
-
- /**
- * @var array<string, Union>|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 0343f19..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/FinallyScope.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class FinallyScope
-{
- /**
- * @var array<string, Union>
- */
- public $vars_in_scope = [];
-
- /**
- * @param array<string, Union> $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 1f98135..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfConditionalScope.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use Psalm\Context;
-use Psalm\Internal\Clause;
-
-/**
- * @internal
- */
-class IfConditionalScope
-{
- /** @var Context */
- public $if_context;
-
- /** @var Context */
- public $post_if_context;
-
- /**
- * @var array<string, bool>
- */
- public $cond_referenced_var_ids;
-
- /**
- * @var array<string, int>
- */
- public $assigned_in_conditional_var_ids;
-
- /** @var list<Clause> */
- public $entry_clauses;
-
- /**
- * @param array<string, bool> $cond_referenced_var_ids
- * @param array<string, int> $assigned_in_conditional_var_ids
- * @param list<Clause> $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 314d93f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/IfScope.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use Psalm\Context;
-use Psalm\Internal\Clause;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class IfScope
-{
- /**
- * @var array<string, Union>|null
- */
- public $new_vars;
-
- /**
- * @var array<string, bool>
- */
- public $new_vars_possibly_in_scope = [];
-
- /**
- * @var array<string, Union>|null
- */
- public $redefined_vars;
-
- /**
- * @var array<string, int>|null
- */
- public $assigned_var_ids;
-
- /**
- * @var array<string, bool>
- */
- public $possibly_assigned_var_ids = [];
-
- /**
- * @var array<string, Union>
- */
- public $possibly_redefined_vars = [];
-
- /**
- * @var array<string, bool>
- */
- public $updated_vars = [];
-
- /**
- * @var array<string, array<int, array<int, string>>>
- */
- public $negated_types = [];
-
- /**
- * @var array<string, bool>
- */
- public $if_cond_changed_var_ids = [];
-
- /**
- * @var array<string, string>|null
- */
- public $negatable_if_types;
-
- /**
- * @var list<Clause>
- */
- 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<Clause>
- */
- 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 4bbb208..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/LoopScope.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use Psalm\Context;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class LoopScope
-{
- /**
- * @var int
- */
- public $iteration_count = 0;
-
- /**
- * @var Context
- */
- public $loop_context;
-
- /**
- * @var Context
- */
- public $loop_parent_context;
-
- /**
- * @var array<string, Union>|null
- */
- public $redefined_loop_vars = [];
-
- /**
- * @var array<string, Union>
- */
- public $possibly_redefined_loop_vars = [];
-
- /**
- * @var array<string, Union>|null
- */
- public $possibly_redefined_loop_parent_vars;
-
- /**
- * @var array<string, Union>
- */
- public $possibly_defined_loop_parent_vars = [];
-
- /**
- * @var array<string, bool>
- */
- public $vars_possibly_in_scope = [];
-
- /**
- * @var array<string, bool>
- */
- 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 35bb99c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Scope/SwitchScope.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Scope;
-
-use PhpParser;
-use Psalm\Internal\Clause;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class SwitchScope
-{
- /**
- * @var array<string, Union>|null
- */
- public $new_vars_in_scope;
-
- /**
- * @var array<string, bool>
- */
- public $new_vars_possibly_in_scope = [];
-
- /**
- * @var array<string, Union>|null
- */
- public $redefined_vars;
-
- /**
- * @var array<string, Union>|null
- */
- public $possibly_redefined_vars;
-
- /**
- * @var array<PhpParser\Node\Stmt>
- */
- public $leftover_statements = [];
-
- /**
- * @var PhpParser\Node\Expr|null
- */
- public $leftover_case_equality_expr;
-
- /**
- * @var list<Clause>
- */
- public $negated_clauses = [];
-
- /**
- * @var array<string, bool>|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 6bc8130..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php
+++ /dev/null
@@ -1,314 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Stubs\Generator;
-
-use PhpParser;
-use Psalm\Codebase;
-use Psalm\Internal\Codebase\ConstantTypeResolver;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\Stmt\VirtualClass;
-use Psalm\Node\Stmt\VirtualClassConst;
-use Psalm\Node\Stmt\VirtualClassMethod;
-use Psalm\Node\Stmt\VirtualInterface;
-use Psalm\Node\Stmt\VirtualProperty;
-use Psalm\Node\Stmt\VirtualPropertyProperty;
-use Psalm\Node\Stmt\VirtualTrait;
-use Psalm\Node\VirtualConst;
-use Psalm\Storage\ClassLikeStorage;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-use ReflectionProperty;
-use UnexpectedValueException;
-use function array_slice;
-use function rtrim;
-
-class ClassLikeStubGenerator
-{
- /**
- * @return PhpParser\Node\Stmt\Class_|PhpParser\Node\Stmt\Interface_|PhpParser\Node\Stmt\Trait_
- */
- public static function getClassLikeNode(
- Codebase $codebase,
- ClassLikeStorage $storage,
- string $classlike_name
- ) : PhpParser\Node\Stmt\ClassLike {
- $subnodes = [
- 'stmts' => 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<PhpParser\Node\Stmt\ClassConst>
- */
- 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<PhpParser\Node\Stmt\Property>
- */
- 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<PhpParser\Node\Stmt\ClassMethod>
- */
- 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 23b1ca1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php
+++ /dev/null
@@ -1,480 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Stubs\Generator;
-
-use Psalm\Codebase;
-use Psalm\Internal\Provider\ClassLikeStorageProvider;
-use Psalm\Internal\Provider\FileStorageProvider;
-use Psalm\Storage\FunctionLikeStorage;
-use Psalm\Type\Atomic\TAnonymousClassInstance;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TAssertionFalsy;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TClosedResource;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TDependentGetDebugType;
-use Psalm\Type\Atomic\TDependentGetType;
-use Psalm\Type\Atomic\TDependentListKey;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TEmptyNumeric;
-use Psalm\Type\Atomic\TEmptyScalar;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntMask;
-use Psalm\Type\Atomic\TIntMaskOf;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyOfClassConstant;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyScalar;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTraitString;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Atomic\TTypeAlias;
-use Psalm\Type\Atomic\TValueOfClassConstant;
-use Psalm\Type\Atomic\TVoid;
-use Psalm\Type\Atomic\Scalar;
-use PhpParser;
-use Psalm\Internal\Scanner\ParsedDocblock;
-use Psalm\Node\Expr\VirtualArray;
-use Psalm\Node\Expr\VirtualArrayItem;
-use Psalm\Node\Expr\VirtualClassConstFetch;
-use Psalm\Node\Expr\VirtualConstFetch;
-use Psalm\Node\Expr\VirtualVariable;
-use Psalm\Node\Name\VirtualFullyQualified;
-use Psalm\Node\Scalar\VirtualDNumber;
-use Psalm\Node\Scalar\VirtualLNumber;
-use Psalm\Node\Scalar\VirtualString;
-use Psalm\Node\Stmt\VirtualFunction;
-use Psalm\Node\Stmt\VirtualNamespace;
-use Psalm\Node\VirtualConst;
-use Psalm\Node\Stmt\VirtualConst as StmtVirtualConst_;
-use Psalm\Node\VirtualIdentifier;
-use Psalm\Node\VirtualName;
-use Psalm\Node\VirtualNullableType;
-use Psalm\Node\VirtualParam;
-use Psalm\Type;
-use Psalm\Type\Union;
-
-use UnexpectedValueException;
-use function dirname;
-use function is_int;
-use function rtrim;
-use function strpos;
-
-class StubsGenerator
-{
- public static function getAll(
- Codebase $codebase,
- ClassLikeStorageProvider $class_provider,
- FileStorageProvider $file_provider
- ): string {
- $namespaced_nodes = [];
-
- $psalm_base = dirname(__DIR__, 5);
-
- foreach ($class_provider->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<PhpParser\Node\Param>
- */
- 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 0023880..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ArrayType.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class ArrayType
-{
- /** @var Union */
- public $key;
-
- /** @var Union */
- public $value;
-
- /** @var bool */
- public $is_list;
-
- public function __construct(Union $key, Union $value, bool $is_list)
- {
- $this->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 d1611ac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/AssertionReconciler.php
+++ /dev/null
@@ -1,1816 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Exception;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\Statements\Expression\Fetch\VariableFetchAnalyzer;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\Comparator\TypeComparisonResult;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\InvalidDocblock;
-use Psalm\Issue\TypeDoesNotContainNull;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function array_intersect_key;
-use function array_merge;
-use function count;
-use function explode;
-use function get_class;
-use function is_string;
-use function strpos;
-use function substr;
-
-class AssertionReconciler extends Reconciler
-{
- /**
- * Reconciles types
- *
- * think of this as a set of functions e.g. empty(T), notEmpty(T), null(T), notNull(T) etc. where
- * - empty(Object) => null,
- * - empty(bool) => false,
- * - notEmpty(Object|null) => Object,
- * - notEmpty(Object|false) => Object
- *
- * @param string[] $suppressed_issues
- * @param array<string, array<string, Union>> $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<string, array<string, Union>> $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<string, array<string, Union>> $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<int>` old is `list<mixed>` so the result is `list<int>`
- *
- * @param array<string, array<string, Union>> $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<string, Atomic> $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<string, Atomic> $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<string, Atomic> $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<string, Atomic> $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<string, Atomic> $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<string, Atomic> $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<string, array<string, Union>> $template_type_map
- * @param array<string> $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 d1b31b8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php
+++ /dev/null
@@ -1,293 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Union;
-
-use function array_map;
-use function range;
-
-/**
- * @internal
- */
-class ArrayTypeComparator
-{
- /**
- * @param TArray|TKeyedArray|TList|TClassStringMap $input_type_part
- * @param TArray|TKeyedArray|TList|TClassStringMap $container_type_part
- */
- public static function isContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality,
- ?TypeComparisonResult $atomic_comparison_result
- ): bool {
- $all_types_contain = true;
-
- $is_empty_array = $input_type_part->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 6f35b1f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php
+++ /dev/null
@@ -1,712 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-
-use function array_merge;
-use function array_values;
-use function count;
-use function get_class;
-use function strtolower;
-
-/**
- * @internal
- */
-class AtomicTypeComparator
-{
- /**
- * Does the input param atomic type match the given param atomic type
- */
- public static function isContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality = false,
- bool $allow_float_int_equality = true,
- ?TypeComparisonResult $atomic_comparison_result = null
- ): bool {
-
- if (($container_type_part instanceof TTemplateParam
- || ($container_type_part instanceof TNamedObject
- && isset($container_type_part->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 107e3dd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php
+++ /dev/null
@@ -1,524 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Exception;
-use PhpParser\Node\Arg;
-use PhpParser\Node\Expr\Variable;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Provider\NodeDataProvider;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use UnexpectedValueException;
-
-use function end;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class CallableTypeComparator
-{
- /**
- * @param TCallable|TClosure $input_type_part
- * @param TCallable|TClosure $container_type_part
- */
- public static function isContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- ?TypeComparisonResult $atomic_comparison_result
- ): bool {
- if ($container_type_part->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 afc0d2c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParamClass;
-
-use function get_class;
-
-/**
- * @internal
- */
-class ClassLikeStringComparator
-{
- /**
- * @param TClassString|TLiteralClassString $input_type_part
- * @param TClassString|TLiteralClassString $container_type_part
- */
- public static function isContainedBy(
- Codebase $codebase,
- Scalar $input_type_part,
- Scalar $container_type_part,
- bool $allow_interface_equality,
- ?TypeComparisonResult $atomic_comparison_result = null
- ): bool {
- if ($container_type_part instanceof TLiteralClassString
- && $input_type_part instanceof TLiteralClassString
- ) {
- return $container_type_part->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 8cd529c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TNamedObject;
-
-/**
- * @internal
- */
-class GenericTypeComparator
-{
- /**
- * @param TGenericObject|TIterable $container_type_part
- */
- public static function isContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality = false,
- ?TypeComparisonResult $atomic_comparison_result = null
- ): bool {
- $all_types_contain = true;
- $container_was_iterable = false;
-
- if ($container_type_part instanceof TIterable
- && !$container_type_part->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 486a4df..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function count;
-use function get_class;
-
-/**
- * @internal
- */
-class IntegerRangeComparator
-{
- /**
- * This method is used to check if an integer range can be contained in another
- */
- public static function isContainedBy(
- TIntRange $input_type_part,
- TIntRange $container_type_part
- ): bool {
- $is_input_min = $input_type_part->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<string, Atomic> $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, max>
- //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<min, X>
- //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<X, Y> 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<X, Y> 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 bb42838..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-
-use function is_string;
-
-/**
- * @internal
- */
-class KeyedArrayComparator
-{
- /**
- * @param TKeyedArray|TObjectWithProperties $input_type_part
- * @param TKeyedArray|TObjectWithProperties $container_type_part
- */
- public static function isContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality,
- ?TypeComparisonResult $atomic_comparison_result
- ): bool {
- $all_types_contain = true;
-
- foreach ($container_type_part->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 b7b4ff3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateParam;
-
-use function array_merge;
-use function in_array;
-use function strpos;
-use function strtolower;
-
-/**
- * @internal
- */
-class ObjectComparator
-{
- /**
- * @param TNamedObject|TTemplateParam|TIterable $input_type_part
- * @param TNamedObject|TTemplateParam|TIterable $container_type_part
- *
- */
- public static function isShallowlyContainedBy(
- Codebase $codebase,
- Atomic $input_type_part,
- Atomic $container_type_part,
- bool $allow_interface_equality,
- ?TypeComparisonResult $atomic_comparison_result
- ): bool {
- $intersection_input_types = $input_type_part->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 12b1dd9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php
+++ /dev/null
@@ -1,640 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TDependentGetDebugType;
-use Psalm\Type\Atomic\TDependentGetType;
-use Psalm\Type\Atomic\TDependentListKey;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\THtmlEscapedString;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TSingleLetter;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTraitString;
-use Psalm\Type\Atomic\TTrue;
-
-use function get_class;
-use function is_numeric;
-use function strtolower;
-
-/**
- * @internal
- */
-class ScalarTypeComparator
-{
- public static function isContainedBy(
- Codebase $codebase,
- Scalar $input_type_part,
- Scalar $container_type_part,
- bool $allow_interface_equality = false,
- bool $allow_float_int_equality = true,
- ?TypeComparisonResult $atomic_comparison_result = null
- ): bool {
- if (get_class($container_type_part) === TString::class
- && $input_type_part instanceof TString
- ) {
- return true;
- }
-
- if (get_class($container_type_part) === TInt::class
- && $input_type_part instanceof TInt
- ) {
- return true;
- }
-
- if (get_class($container_type_part) === TFloat::class
- && $input_type_part instanceof TFloat
- ) {
- return true;
- }
-
- if ($container_type_part instanceof TNonEmptyString
- && get_class($input_type_part) === TString::class
- ) {
- if ($atomic_comparison_result) {
- $atomic_comparison_result->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 5fbe29a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-class TypeComparisonResult
-{
- /** @var ?bool */
- public $scalar_type_match_found;
-
- /** @var ?bool */
- public $type_coerced;
-
- /** @var ?bool */
- public $type_coerced_from_mixed;
-
- /** @var ?bool */
- public $type_coerced_from_as_mixed;
-
- /** @var ?bool */
- public $to_string_cast;
-
- /**
- * This is primarily used for array access.
- * For example in this function we know that there are only two possible keys, 0 and 1
- * But we allow the array to be addressed by an arbitrary integer $i.
- *
- * function takesAnInt(int $i): string {
- * return ["foo", "bar"][$i];
- * }
- *
- * @var ?bool
- */
- public $type_coerced_from_scalar;
-
- /** @var ?Union */
- public $replacement_union_type;
-
- /** @var ?Atomic */
- public $replacement_atomic_type;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php
deleted file mode 100644
index c997199..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php
+++ /dev/null
@@ -1,499 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\Comparator;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTypeAlias;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function array_pop;
-use function array_push;
-use function array_reverse;
-
-/**
- * @internal
- */
-class UnionTypeComparator
-{
- /**
- * Does the input param type match the given param type
- */
- public static function isContainedBy(
- Codebase $codebase,
- Union $input_type,
- Union $container_type,
- bool $ignore_null = false,
- bool $ignore_false = false,
- ?TypeComparisonResult $union_comparison_result = null,
- bool $allow_interface_equality = false,
- bool $allow_float_int_equality = true
- ): bool {
- if ($container_type->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<Atomic>
- */
- 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 b3387f3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/NegatedAssertionReconciler.php
+++ /dev/null
@@ -1,425 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Analyzer\TraitAnalyzer;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TEnumCase;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function count;
-use function explode;
-use function get_class;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class NegatedAssertionReconciler extends Reconciler
-{
- /**
- * @param array<string, array<string, Union>> $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 fa3f0b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-/**
- * @internal
- */
-class ParseTree
-{
- /**
- * @var list<ParseTree>
- */
- 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 ae0b8ca..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class CallableParamTree extends ParseTree
-{
- /**
- * @var bool
- */
- public $variadic = false;
-
- /**
- * @var bool
- */
- public $has_default = false;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php
deleted file mode 100644
index 404211d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableTree.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class CallableTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- /**
- * @var bool
- */
- public $terminated = false;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 3069d73..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class CallableWithReturnTypeTree extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php
deleted file mode 100644
index b743f0a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class ConditionalTree extends ParseTree
-{
- /**
- * @var TemplateIsTree
- */
- public $condition;
-
- public function __construct(TemplateIsTree $condition, ?ParseTree $parent = null)
- {
- $this->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 5fc3464..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class EncapsulationTree extends ParseTree
-{
- /**
- * @var bool
- */
- public $terminated = false;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php
deleted file mode 100644
index fc17d02..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/GenericTree.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class GenericTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- /**
- * @var bool
- */
- public $terminated = false;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 a38b8e7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class IndexedAccessTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 7025160..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class IntersectionTree extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php
deleted file mode 100644
index e06d863..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class KeyedArrayPropertyTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 4da6cf7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class KeyedArrayTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- /**
- * @var bool
- */
- public $terminated = false;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 a3a531e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class MethodParamTree extends ParseTree
-{
- /**
- * @var bool
- */
- public $variadic;
-
- /**
- * @var string
- */
- public $default = '';
-
- /**
- * @var bool
- */
- public $byref;
-
- /**
- * @var string
- */
- public $name;
-
- public function __construct(
- string $name,
- bool $byref,
- bool $variadic,
- ?ParseTree $parent = null
- ) {
- $this->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 f21ef8e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodTree.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class MethodTree extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- public function __construct(string $value, ?ParseTree $parent = null)
- {
- $this->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 47701b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class MethodWithReturnTypeTree extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php
deleted file mode 100644
index 2471184..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/NullableTree.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class NullableTree extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php
deleted file mode 100644
index b08f963..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Root.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class Root extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php
deleted file mode 100644
index c8dbd79..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class TemplateAsTree extends ParseTree
-{
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var string
- */
- public $as;
-
- public function __construct(string $param_name, string $as, ?ParseTree $parent = null)
- {
- $this->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 3a96b6c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class TemplateIsTree extends ParseTree
-{
- /**
- * @var string
- */
- public $param_name;
-
- public function __construct(string $param_name, ?ParseTree $parent = null)
- {
- $this->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 1f8de48..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/UnionTree.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class UnionTree extends ParseTree
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php
deleted file mode 100644
index 952aad3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTree/Value.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\ParseTree;
-
-use Psalm\Internal\Type\ParseTree;
-
-/**
- * @internal
- */
-class Value extends ParseTree
-{
- /**
- * @var string
- */
- public $value;
-
- /**
- * @var int
- */
- public $offset_start;
-
- /**
- * @var int
- */
- public $offset_end;
-
- /**
- * @var ?string
- */
- public $text;
-
- /**
- * @param ParseTree|null $parent
- */
- public function __construct(
- string $value,
- int $offset_start,
- int $offset_end,
- ?string $text,
- ParseTree $parent = null
- ) {
- $this->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 edad53c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/ParseTreeCreator.php
+++ /dev/null
@@ -1,842 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Type\ParseTree\CallableParamTree;
-use Psalm\Internal\Type\ParseTree\CallableTree;
-use Psalm\Internal\Type\ParseTree\CallableWithReturnTypeTree;
-use Psalm\Internal\Type\ParseTree\ConditionalTree;
-use Psalm\Internal\Type\ParseTree\EncapsulationTree;
-use Psalm\Internal\Type\ParseTree\GenericTree;
-use Psalm\Internal\Type\ParseTree\IndexedAccessTree;
-use Psalm\Internal\Type\ParseTree\IntersectionTree;
-use Psalm\Internal\Type\ParseTree\KeyedArrayPropertyTree;
-use Psalm\Internal\Type\ParseTree\KeyedArrayTree;
-use Psalm\Internal\Type\ParseTree\MethodParamTree;
-use Psalm\Internal\Type\ParseTree\MethodTree;
-use Psalm\Internal\Type\ParseTree\MethodWithReturnTypeTree;
-use Psalm\Internal\Type\ParseTree\NullableTree;
-use Psalm\Internal\Type\ParseTree\Root;
-use Psalm\Internal\Type\ParseTree\TemplateAsTree;
-use Psalm\Internal\Type\ParseTree\TemplateIsTree;
-use Psalm\Internal\Type\ParseTree\UnionTree;
-use Psalm\Internal\Type\ParseTree\Value;
-
-use function array_pop;
-use function count;
-use function in_array;
-use function preg_match;
-use function strlen;
-use function strtolower;
-
-/**
- * @internal
- */
-class ParseTreeCreator
-{
- /** @var ParseTree */
- private $parse_tree;
-
- /** @var ParseTree */
- private $current_leaf;
-
- /** @var array<int, array{0: string, 1: int}> */
- private $type_tokens;
-
- /** @var int */
- private $type_token_count;
-
- /** @var int */
- private $t = 0;
-
- /**
- * @param list<array{0: string, 1: int, 2?: string}> $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] ?? '<empty>')
- );
- }
-
- $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 0c46ef2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleAssertionReconciler.php
+++ /dev/null
@@ -1,2554 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\Codebase\ClassConstantByWildcardResolver;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Type;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TEmptyNumeric;
-use Psalm\Type\Atomic\TEmptyScalar;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function assert;
-use function count;
-use function explode;
-use function get_class;
-use function max;
-use function min;
-use function strpos;
-use function substr;
-
-/**
- * This class receives a known type and an assertion (probably coming from AssertionFinder). The goal is to refine
- * the known type using the assertion. For example: old type is `int` assertion is `>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<empty, empty>') {
- $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 02fac14..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php
+++ /dev/null
@@ -1,1819 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\Codebase\InternalCallMapHandler;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\RedundantPropertyInitializationCheck;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyScalar;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Reconciler;
-use Psalm\Type\Union;
-
-use function assert;
-use function get_class;
-use function max;
-use function strpos;
-use function substr;
-
-class SimpleNegatedAssertionReconciler extends Reconciler
-{
- /**
- * @param string[] $suppressed_issues
- * @param Reconciler::RECONCILIATION_* $failed_reconciliation
- */
- public static function reconcile(
- Codebase $codebase,
- string $assertion,
- Union $existing_var_type,
- ?string $key = null,
- bool $negated = false,
- ?CodeLocation $code_location = null,
- array $suppressed_issues = [],
- int &$failed_reconciliation = Reconciler::RECONCILIATION_EMPTY,
- bool $is_equality = false,
- bool $inside_loop = false
- ): ?Union {
- $old_var_type_string = $existing_var_type->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<empty, empty>') {
- $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 da8da46..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateBound.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Type\Union;
-
-class TemplateBound
-{
- /**
- * @var Union
- */
- public $type;
-
- /**
- * This is the depth at which the template appears in a given type.
- *
- * In the type Foo<T, Bar<T, array<T>>> 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<T, string, T> 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 d0aff71..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php
+++ /dev/null
@@ -1,416 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use InvalidArgumentException;
-use Psalm\Codebase;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_shift;
-use function array_values;
-use function strpos;
-
-class TemplateInferredTypeReplacer
-{
- /**
- * This replaces template types in unions with the inferred types they should be
- */
- public static function replace(
- Union $union,
- TemplateResult $template_result,
- ?Codebase $codebase
- ): void {
- $keys_to_unset = [];
-
- $new_types = [];
-
- $is_mixed = false;
-
- $inferred_lower_bounds = $template_result->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 c213eb5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateResult.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Type\Union;
-
-use function array_map;
-
-/**
- * This class captures the result of running Psalm's argument analysis with
- * regard to generic parameters.
- *
- * It captures upper and lower bounds for parameters. Mostly we just care about
- * lower bounds — those are captured when calling a function that expects a
- * non-callable templated argument.
- *
- * Upper bounds are found in callable parameter types. Given a parameter type
- * `callable(T1): void` and an argument typed as `callable(int): void`, `int` will
- * be added as an _upper_ bound for the template param `T1`. This only applies to
- * parameters — given a parameter type `callable(): T2` and an argument typed as
- * `callable(): string`, `string` will be added as a _lower_ bound for the template
- * param `T2`.
- */
-class TemplateResult
-{
- /**
- * @var array<string, array<string, Union>>
- */
- public $template_types;
-
- /**
- * @var array<string, array<string, non-empty-list<TemplateBound>>>
- */
- public $lower_bounds;
-
- /**
- * @var array<string, array<string, TemplateBound>>
- */
- public $upper_bounds = [];
-
- /**
- * If set to true then we shouldn't update the template bounds
- *
- * @var bool
- */
- public $readonly = false;
-
- /**
- * @var list<Union>
- */
- public $upper_bounds_unintersectable_types = [];
-
- /**
- * @param array<string, array<string, Union>> $template_types
- * @param array<string, array<string, Union>> $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 7d6dbf6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php
+++ /dev/null
@@ -1,1249 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use InvalidArgumentException;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\Methods;
-use Psalm\Internal\Type\Comparator\CallableTypeComparator;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-use Throwable;
-
-use function array_fill;
-use function array_keys;
-use function array_merge;
-use function array_search;
-use function array_slice;
-use function array_values;
-use function count;
-use function in_array;
-use function reset;
-use function strpos;
-use function strtolower;
-use function substr;
-use function usort;
-
-class TemplateStandinTypeReplacer
-{
- /**
- * This replaces template types in unions with standins (normally the template as type)
- *
- * $input_type here is normally the argument passed to a templated function or method.
- *
- * This method fills in the values in $template_result based on how the various atomic types
- * of $union_type match up to the types inside $input_type
- */
- public static function replace(
- Union $union_type,
- TemplateResult $template_result,
- ?Codebase $codebase,
- ?StatementsAnalyzer $statements_analyzer,
- ?Union $input_type,
- ?int $input_arg_offset = null,
- ?string $calling_class = null,
- ?string $calling_function = null,
- bool $replace = true,
- bool $add_lower_bound = false,
- ?string $bound_equality_classlike = null,
- int $depth = 1
- ): Union {
- $atomic_types = [];
-
- $original_atomic_types = $union_type->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<Atomic>
- */
- 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<string|int>` to a function that expects `array<T>`, a rule in this method
- * identifies the matching atomic types for `T` as `string|int`
- *
- * @return list<Atomic>
- */
- 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<Atomic>
- */
- 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<TClassString>
- */
- 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<string, array<string, non-empty-list<TemplateBound>>> $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<TemplateBound> $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<Union>
- */
- 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 a8c05fb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-interface TypeAlias
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php
deleted file mode 100644
index 5f5146e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\TypeAlias;
-
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Type\Atomic;
-
-class ClassTypeAlias implements TypeAlias
-{
- /**
- * @var list<Atomic>
- */
- public $replacement_atomic_types;
-
- /**
- * @param list<Atomic> $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 9ed473c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\TypeAlias;
-
-use Psalm\Internal\Type\TypeAlias;
-
-/**
- * @psalm-immutable
- */
-class InlineTypeAlias implements TypeAlias
-{
- /**
- * @var list<array{0: string, 1: int}>
- */
- public $replacement_tokens;
-
- /**
- * @param list<array{0: string, 1: int}> $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 a0c309d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type\TypeAlias;
-
-use Psalm\Internal\Type\TypeAlias;
-
-/**
- * @psalm-immutable
- */
-class LinkableTypeAlias implements TypeAlias
-{
- public $declaring_fq_classlike_name;
-
- public $alias_name;
-
- public $line_number;
-
- public $start_offset;
-
- public $end_offset;
-
- public function __construct(
- string $declaring_fq_classlike_name,
- string $alias_name,
- int $line_number,
- int $start_offset,
- int $end_offset
- ) {
- $this->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 d45af1c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-/**
- * @internal
- */
-class TypeCombination
-{
- /** @var array<string, Atomic> */
- public $value_types = [];
-
- /** @var array<string, TNamedObject>|null */
- public $named_object_types = [];
-
- /** @var list<Union> */
- public $array_type_params = [];
-
- /** @var array<string, non-empty-list<Union>> */
- public $builtin_type_params = [];
-
- /** @var array<string, non-empty-list<Union>> */
- public $object_type_params = [];
-
- /** @var array<string, bool> */
- public $object_static = [];
-
- /** @var array<int, bool>|null */
- public $array_counts = [];
-
- /** @var bool */
- public $array_sometimes_filled = false;
-
- /** @var bool */
- public $array_always_filled = true;
-
- /** @var array<string|int, Union> */
- 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<string, TLiteralString>|null */
- public $strings = [];
-
- /** @var array<string, TLiteralInt>|null */
- public $ints = [];
-
- /** @var array<string, TLiteralFloat>|null */
- public $floats = [];
-
- /** @var array<string, TNamedObject|TObject>|null */
- public $class_string_types = [];
-
- /**
- * @var array<string, TNamedObject|TTemplateParam|TIterable|TObject>|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<string, bool> */
- public $class_string_map_names = [];
-
- /** @var array<string, ?TNamedObject> */
- 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 ec939c1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombiner.php
+++ /dev/null
@@ -1,1528 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use InvalidArgumentException;
-use Psalm\Codebase;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_intersect_key;
-use function array_key_exists;
-use function array_keys;
-use function array_merge;
-use function array_values;
-use function count;
-use function get_class;
-use function is_int;
-use function is_numeric;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class TypeCombiner
-{
- /**
- * Combines types together
- * - so `int + string = int|string`
- * - so `array<int> + array<string> = array<int|string>`
- * - and `array<int> + string = array<int>|string`
- * - and `array<empty> + array<empty> = array<empty>`
- * - and `array<string> + array<empty> = array<string>`
- * - and `array + array<string> = array<mixed>`
- *
- * @param non-empty-list<Atomic> $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<string, bool>
- */
- private static function getSharedTypes(TypeCombination $combination, Codebase $codebase): array
- {
- /** @var array<string, bool>|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<string, true>
- */
- 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<Atomic>
- */
- 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 3709534..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php
+++ /dev/null
@@ -1,909 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Codebase;
-use Psalm\Exception\CircularReferenceException;
-use Psalm\Internal\Type\SimpleAssertionReconciler;
-use Psalm\Internal\Type\SimpleNegatedAssertionReconciler;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntMask;
-use Psalm\Type\Atomic\TIntMaskOf;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyOfClassConstant;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTypeAlias;
-use Psalm\Type\Atomic\TValueOfClassConstant;
-use Psalm\Type\Atomic\TVoid;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function array_filter;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-use function get_class;
-use function is_array;
-use function is_string;
-use function reset;
-use function strpos;
-use function strtolower;
-use function substr;
-
-/**
- * @internal
- */
-class TypeExpander
-{
- /**
- * @param string|TNamedObject|TTemplateParam|null $static_class_type
- *
- */
- public static function expandUnion(
- Codebase $codebase,
- Union $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
- ): Union {
- $return_type = clone $return_type;
-
- $new_return_type_parts = [];
-
- $has_array_output = false;
-
- foreach ($return_type->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<Atomic>
- */
- 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<Atomic>
- */
- 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 fbcad54..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php
+++ /dev/null
@@ -1,1336 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use InvalidArgumentException;
-use LogicException;
-use Psalm\Codebase;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\Type\ParseTree\CallableParamTree;
-use Psalm\Internal\Type\ParseTree\CallableTree;
-use Psalm\Internal\Type\ParseTree\CallableWithReturnTypeTree;
-use Psalm\Internal\Type\ParseTree\ConditionalTree;
-use Psalm\Internal\Type\ParseTree\EncapsulationTree;
-use Psalm\Internal\Type\ParseTree\GenericTree;
-use Psalm\Internal\Type\ParseTree\IndexedAccessTree;
-use Psalm\Internal\Type\ParseTree\IntersectionTree;
-use Psalm\Internal\Type\ParseTree\KeyedArrayPropertyTree;
-use Psalm\Internal\Type\ParseTree\KeyedArrayTree;
-use Psalm\Internal\Type\ParseTree\MethodTree;
-use Psalm\Internal\Type\ParseTree\MethodWithReturnTypeTree;
-use Psalm\Internal\Type\ParseTree\NullableTree;
-use Psalm\Internal\Type\ParseTree\TemplateAsTree;
-use Psalm\Internal\Type\ParseTree\UnionTree;
-use Psalm\Internal\Type\ParseTree\Value;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntMask;
-use Psalm\Type\Atomic\TIntMaskOf;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyOfClassConstant;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TTemplateIndexedAccess;
-use Psalm\Type\Atomic\TTemplateKeyOf;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTypeAlias;
-use Psalm\Type\Atomic\TValueOfClassConstant;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-
-use function array_key_exists;
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_pop;
-use function array_shift;
-use function array_unique;
-use function array_unshift;
-use function array_values;
-use function assert;
-use function constant;
-use function count;
-use function defined;
-use function end;
-use function explode;
-use function get_class;
-use function in_array;
-use function is_int;
-use function is_numeric;
-use function preg_match;
-use function preg_replace;
-use function reset;
-use function stripslashes;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class TypeParser
-{
- /**
- * Parses a string type representation
- *
- * @param list<array{0: string, 1: int, 2?: string}> $type_tokens
- * @param array{int,int}|null $php_version
- * @param array<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<int> $potential_ints
- * @return non-empty-list<TLiteralInt>
- */
- public static function getComputedIntsFromMask(array $potential_ints): array
- {
- /** @var list<int> */
- $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<string|int, Union> */
- $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<string, array<string, Union>> $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<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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 020a3b2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeTokenizer.php
+++ /dev/null
@@ -1,511 +0,0 @@
-<?php
-
-namespace Psalm\Internal\Type;
-
-use Psalm\Aliases;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Type\TypeAlias\InlineTypeAlias;
-use Psalm\Type;
-
-use function array_splice;
-use function array_unshift;
-use function count;
-use function in_array;
-use function is_numeric;
-use function preg_match;
-use function preg_replace;
-use function str_split;
-use function strlen;
-use function strpos;
-use function strtolower;
-
-class TypeTokenizer
-{
- /**
- * @var array<string, bool>
- */
- 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<string, list<array{0: string, 1: int}>>
- */
- 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<array{string, int}>
- *
- * @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<array{0: string, 1: int}> $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<string, mixed>|null $template_type_map
- * @param array<string, TypeAlias>|null $type_aliases
- *
- * @return list<array{0: string, 1: int, 2?: string}>
- */
- 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<array{0: string, 1: int, 2?: string}> */
- 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 94d55b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-
-use function strtolower;
-
-class ContainsClassLikeVisitor extends NodeVisitor
-{
- /**
- * @var lowercase-string
- */
- private $fq_classlike_name;
-
- /**
- * @var bool
- */
- private $contains_classlike = false;
-
- /**
- * @param lowercase-string $fq_classlike_name
- */
- public function __construct(string $fq_classlike_name)
- {
- $this->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 e7d3f06..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-
-class ContainsLiteralVisitor extends NodeVisitor
-{
- /**
- * @var bool
- */
- private $contains_literal = false;
-
- protected function enterNode(TypeNode $type): ?int
- {
- if ($type instanceof TLiteralString
- || $type instanceof TLiteralInt
- || $type instanceof TLiteralFloat
- || $type instanceof TTrue
- || $type instanceof TFalse
- ) {
- $this->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 3846e76..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-
-class FromDocblockSetter extends NodeVisitor
-{
- /**
- * @psalm-suppress MoreSpecificImplementedParamType
- *
- * @param Atomic|Union $type
- * @return self::STOP_TRAVERSAL|self::DONT_TRAVERSE_CHILDREN|null
- */
- protected function enterNode(TypeNode $type): ?int
- {
- $type->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 1b3d365..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use Psalm\Type;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-
-class TemplateTypeCollector extends NodeVisitor
-{
- /**
- * @var list<TTemplateParam>
- */
- 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<TTemplateParam>
- */
- 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 7cb18b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeChecker.php
+++ /dev/null
@@ -1,410 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use InvalidArgumentException;
-use Psalm\CodeLocation;
-use Psalm\CodeLocation\DocblockTypeLocation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Analyzer\ClassLikeNameOptions;
-use Psalm\Internal\Analyzer\MethodAnalyzer;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DeprecatedClass;
-use Psalm\Issue\InvalidTemplateParam;
-use Psalm\Issue\MissingTemplateParam;
-use Psalm\Issue\ReservedWord;
-use Psalm\Issue\TooManyTemplateParams;
-use Psalm\Issue\UndefinedConstant;
-use Psalm\IssueBuffer;
-use Psalm\StatementsSource;
-use Psalm\Storage\MethodStorage;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-use ReflectionProperty;
-
-use function array_keys;
-use function array_search;
-use function count;
-use function is_array;
-use function md5;
-use function strpos;
-use function strtolower;
-
-class TypeChecker extends NodeVisitor
-{
- /**
- * @var StatementsSource
- */
- private $source;
-
- /**
- * @var CodeLocation
- */
- private $code_location;
-
- /**
- * @var array<string>
- */
- private $suppressed_issues;
-
- /**
- * @var array<string, bool>
- */
- 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<string> $suppressed_issues
- * @param array<string, bool> $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 3e74288..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Internal/TypeVisitor/TypeScanner.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace Psalm\Internal\TypeVisitor;
-
-use Psalm\Internal\Codebase\Scanner;
-use Psalm\Storage\FileStorage;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\NodeVisitor;
-use Psalm\Type\TypeNode;
-
-use function strtolower;
-
-class TypeScanner extends NodeVisitor
-{
- private $scanner;
-
- private $file_storage;
-
- private $phantom_classes;
-
- /**
- * @param array<string, mixed> $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 a3a3a1a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractInstantiation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class AbstractInstantiation extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 72;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php
deleted file mode 100644
index 9bab123..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/AbstractMethodCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class AbstractMethodCall extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 223;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php
deleted file mode 100644
index f9db113..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentIssue.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-abstract class ArgumentIssue extends CodeIssue
-{
- /**
- * @var ?string
- */
- public $function_id;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- ?string $function_id = null
- ) {
- parent::__construct($message, $code_location);
- $this->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 e200e56..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ArgumentTypeCoercion.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ArgumentTypeCoercion extends ArgumentIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 193;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php b/vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php
deleted file mode 100644
index bcb6eb7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/AssignmentToVoid.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class AssignmentToVoid extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 121;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php b/vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php
deleted file mode 100644
index dcf68d3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/CircularReference.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class CircularReference extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 131;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php
deleted file mode 100644
index 3efaa7e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ClassIssue.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-abstract class ClassIssue extends CodeIssue
-{
- /**
- * @var string
- */
- public $fq_classlike_name;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $fq_classlike_name
- ) {
- parent::__construct($message, $code_location);
- $this->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 00bb8b2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/CodeIssue.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\IssueData;
-
-use function array_pop;
-use function explode;
-
-abstract class CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 0;
-
- /**
- * @var CodeLocation
- * @readonly
- */
- public $code_location;
-
- /**
- * @var string
- * @readonly
- */
- public $message;
-
- /**
- * @var ?string
- */
- public $dupe_key;
-
- public function __construct(
- string $message,
- CodeLocation $code_location
- ) {
- $this->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 bce1eb0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexFunction.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ComplexFunction extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 259;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php
deleted file mode 100644
index 63ddbf2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ComplexMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ComplexMethod extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 260;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php
deleted file mode 100644
index 8697cb0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ConfigIssue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ConfigIssue extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 271;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php b/vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php
deleted file mode 100644
index 4afada5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ConflictingReferenceConstraint.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ConflictingReferenceConstraint extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 85;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php
deleted file mode 100644
index 404d671..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ConstructorSignatureMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ConstructorSignatureMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 231;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php b/vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php
deleted file mode 100644
index 1a36c6f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ContinueOutsideLoop.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ContinueOutsideLoop extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 43;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php
deleted file mode 100644
index 2b1ac46..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedClass extends ClassIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 98;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php
deleted file mode 100644
index abbeb7a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedConstant.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedConstant extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 170;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php
deleted file mode 100644
index b207a01..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedFunction.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedFunction extends FunctionIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 201;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php
deleted file mode 100644
index 69989a8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedInterface.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedInterface extends ClassIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 152;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php
deleted file mode 100644
index b923852..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 1;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php
deleted file mode 100644
index ebb2ccd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedProperty extends PropertyIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 99;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php b/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php
deleted file mode 100644
index 2912257..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DeprecatedTrait.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DeprecatedTrait extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 171;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php b/vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php
deleted file mode 100644
index 59e845b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DocblockTypeContradiction.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class DocblockTypeContradiction extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 155;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
- $this->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 9bb2d05..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateArrayKey.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateArrayKey extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 151;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php
deleted file mode 100644
index a503f5e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateClass extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 71;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php
deleted file mode 100644
index 73783e3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateConstant.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateConstant extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 302;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php
deleted file mode 100644
index 06f768b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCase.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateEnumCase extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 277;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php
deleted file mode 100644
index 7c0bd49..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateEnumCaseValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateEnumCaseValue extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 279;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php
deleted file mode 100644
index 93a7881..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateFunction.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateFunction extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 180;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php
deleted file mode 100644
index 1d39a16..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateMethod extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 178;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php
deleted file mode 100644
index 673ec5a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/DuplicateParam.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class DuplicateParam extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 65;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php
deleted file mode 100644
index b9039a7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/EmptyArrayAccess.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class EmptyArrayAccess extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 100;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php b/vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php
deleted file mode 100644
index 4fce9cd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ExtensionRequirementViolation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ExtensionRequirementViolation extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 239;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php
deleted file mode 100644
index 98efe6e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/FalsableReturnStatement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class FalsableReturnStatement extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 137;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php
deleted file mode 100644
index 076b619..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/FalseOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class FalseOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 161;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php b/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php
deleted file mode 100644
index 5bd4479..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenCode.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ForbiddenCode extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 2;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php b/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php
deleted file mode 100644
index 73a84fe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ForbiddenEcho.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ForbiddenEcho extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 172;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php
deleted file mode 100644
index 8294809..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/FunctionIssue.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-abstract class FunctionIssue extends CodeIssue
-{
- /**
- * @var string
- */
- public $function_id;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $function_id
- ) {
- parent::__construct($message, $code_location);
- $this->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 c9bcba5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/IfThisIsMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class IfThisIsMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 300;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php
deleted file mode 100644
index 1b6886f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementationRequirementViolation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImplementationRequirementViolation extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 240;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php
deleted file mode 100644
index a275a5a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedParamTypeMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImplementedParamTypeMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 199;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php
deleted file mode 100644
index 07dc73e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImplementedReturnTypeMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImplementedReturnTypeMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 123;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php
deleted file mode 100644
index b6cc00f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImplicitToStringCast.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImplicitToStringCast extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 60;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php
deleted file mode 100644
index 64d6901..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureByReferenceAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureByReferenceAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 220;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php
deleted file mode 100644
index da21353..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 202;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php
deleted file mode 100644
index 9e5017e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureMethodCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureMethodCall extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 203;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php
deleted file mode 100644
index 8576df6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpurePropertyAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 204;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php
deleted file mode 100644
index 9ceb1e2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpurePropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpurePropertyFetch extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 234;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php
deleted file mode 100644
index ac32379..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureStaticProperty extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 221;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php
deleted file mode 100644
index 00d8858..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureStaticVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureStaticVariable extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 210;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php
deleted file mode 100644
index ec9e356..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ImpureVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ImpureVariable extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 235;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php b/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php
deleted file mode 100644
index e0d02e2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleClassConstant.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InaccessibleClassConstant extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 53;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php
deleted file mode 100644
index 435655b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InaccessibleMethod extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 3;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php
deleted file mode 100644
index dbff125..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InaccessibleProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InaccessibleProperty extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 54;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php b/vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php
deleted file mode 100644
index a5a36b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InterfaceInstantiation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InterfaceInstantiation extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 158;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php
deleted file mode 100644
index 8062f1d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InternalClass.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use function array_pop;
-use function count;
-use function implode;
-use function reset;
-
-class InternalClass extends ClassIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 174;
-
- /** @param non-empty-list<non-empty-string> $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 a7e19d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InternalMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InternalMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 175;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php
deleted file mode 100644
index 4d4510a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InternalProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InternalProperty extends PropertyIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 176;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php
deleted file mode 100644
index 5e082e2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 4;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php
deleted file mode 100644
index 76293b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAccess.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidArrayAccess extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 5;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php
deleted file mode 100644
index 565e50b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidArrayAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 6;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php
deleted file mode 100644
index a4a6e3f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 115;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php
deleted file mode 100644
index 73587cf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidAttribute.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidAttribute extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 242;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php
deleted file mode 100644
index 5c7f243..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCast.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidCast extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 103;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php
deleted file mode 100644
index a62d446..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidCatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidCatch extends ClassIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 132;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php
deleted file mode 100644
index 319fc7f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidClass extends ClassIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 7;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php
deleted file mode 100644
index 983483a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidClone.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidClone extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 69;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php
deleted file mode 100644
index 51c08f5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblock.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidDocblock extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 8;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php
deleted file mode 100644
index 30bf65b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidDocblockParamName.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidDocblockParamName extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 187;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php
deleted file mode 100644
index 31853af..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumBackingType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidEnumBackingType extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 276;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php
deleted file mode 100644
index 0d21c69..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidEnumCaseValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidEnumCaseValue extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 278;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php
deleted file mode 100644
index 4407f5a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidExtendClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidExtendClass extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 232;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php
deleted file mode 100644
index 0b1094e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFalsableReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidFalsableReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 143;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php
deleted file mode 100644
index 2af3078..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 64;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php
deleted file mode 100644
index 4cc7669..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidGlobal.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidGlobal extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 46;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php
deleted file mode 100644
index 0d3e3b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidIterator.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidIterator extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 9;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php
deleted file mode 100644
index 4608a07..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidLiteralArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidLiteralArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 237;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php
deleted file mode 100644
index 8c3c804..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidMethodCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidMethodCall extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 91;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php
deleted file mode 100644
index 23c01f7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNamedArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidNamedArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 238;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php
deleted file mode 100644
index 59741ba..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidNullableReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidNullableReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 144;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php
deleted file mode 100644
index c30c105..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 58;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php
deleted file mode 100644
index fe4757e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParamDefault.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidParamDefault extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 62;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php
deleted file mode 100644
index a4070a9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidParent.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidParent extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 214;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php
deleted file mode 100644
index 76d9e23..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPassByReference.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidPassByReference extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 102;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php
deleted file mode 100644
index 7a3f5c4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidPropertyAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 10;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php
deleted file mode 100644
index 5b238d2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyAssignmentValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidPropertyAssignmentValue extends PropertyIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 145;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php
deleted file mode 100644
index 5fae19b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidPropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidPropertyFetch extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 29;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php
deleted file mode 100644
index c2e80d7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnStatement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidReturnStatement extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 128;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php
deleted file mode 100644
index 1d70d28..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 11;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php
deleted file mode 100644
index 21742a6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScalarArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidScalarArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 12;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php
deleted file mode 100644
index a7502b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidScope.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidScope extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 13;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php
deleted file mode 100644
index b4f0ffb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStaticInvocation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidStaticInvocation extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 14;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php
deleted file mode 100644
index 1d4576f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidStringClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidStringClass extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 160;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php
deleted file mode 100644
index 6af20e9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTemplateParam.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidTemplateParam extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 183;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php
deleted file mode 100644
index ea28744..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidThrow.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidThrow extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 133;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php
deleted file mode 100644
index 4ced32e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidToString.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidToString extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 55;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php
deleted file mode 100644
index c07fd12..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTraversableImplementation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidTraversableImplementation extends ClassIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 266;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php b/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php
deleted file mode 100644
index 5ee94d9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/InvalidTypeImport.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class InvalidTypeImport extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 233;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php
deleted file mode 100644
index 90f60e5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificImplementedReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class LessSpecificImplementedReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 166;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php
deleted file mode 100644
index c65a9e5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnStatement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class LessSpecificReturnStatement extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 129;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php
deleted file mode 100644
index cade4bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/LessSpecificReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class LessSpecificReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 88;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php b/vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php
deleted file mode 100644
index 650fc35..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/LoopInvalidation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class LoopInvalidation extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 130;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php
deleted file mode 100644
index 2cc7dfe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MethodIssue.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-abstract class MethodIssue extends CodeIssue
-{
- /**
- * @var string
- */
- public $method_id;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $method_id
- ) {
- parent::__construct($message, $code_location);
- $this->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 812353f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MethodSignatureMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 42;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php
deleted file mode 100644
index bce1362..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MethodSignatureMustOmitReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 168;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php
deleted file mode 100644
index ab05f06..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MethodSignatureMustProvideReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 282;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php
deleted file mode 100644
index 7033516..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockParamType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MismatchingDocblockParamType extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 141;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php
deleted file mode 100644
index 392e028..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockPropertyType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MismatchingDocblockPropertyType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 264;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php
deleted file mode 100644
index ea6218c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MismatchingDocblockReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MismatchingDocblockReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 142;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php
deleted file mode 100644
index b0f2b09..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureParamType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingClosureParamType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 153;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php
deleted file mode 100644
index b3e25ae..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingClosureReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingClosureReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 68;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php
deleted file mode 100644
index 6452982..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingConstructor.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class MissingConstructor extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 73;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
- $this->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 83afc87..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDependency.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingDependency extends ClassIssue
-{
- public const SHORTCODE = 157;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php
deleted file mode 100644
index ffa8e8e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingDocblockType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingDocblockType extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 110;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php
deleted file mode 100644
index ede555c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingFile.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingFile extends CodeIssue
-{
- public const SHORTCODE = 107;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php
deleted file mode 100644
index 5fed691..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingImmutableAnnotation.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingImmutableAnnotation extends CodeIssue
-{
- public const SHORTCODE = 213;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php
deleted file mode 100644
index ba7816a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingParamType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingParamType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 154;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php
deleted file mode 100644
index 0bea29f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingPropertyType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingPropertyType extends PropertyIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 45;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php
deleted file mode 100644
index e9253f4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 50;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php
deleted file mode 100644
index a3e7b98..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingTemplateParam.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingTemplateParam extends CodeIssue
-{
- public const SHORTCODE = 182;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php b/vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php
deleted file mode 100644
index 82e610b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MissingThrowsDocblock.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MissingThrowsDocblock extends CodeIssue
-{
- public const SHORTCODE = 169;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php
deleted file mode 100644
index 9422b69..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgument.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-class MixedArgument extends ArgumentIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 30;
-
- use MixedIssueTrait;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- ?string $function_id = null,
- ?CodeLocation $origin_location = null
- ) {
- $this->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 1d18ace..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArgumentTypeCoercion.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-class MixedArgumentTypeCoercion extends ArgumentIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 194;
-
- use MixedIssueTrait;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- ?string $function_id = null,
- ?CodeLocation $origin_location = null
- ) {
- $this->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 54dc6ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAccess.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedArrayAccess extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 51;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php
deleted file mode 100644
index 7d046b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayAssignment.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedArrayAssignment extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 117;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php
deleted file mode 100644
index ff53ea2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayOffset.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedArrayOffset extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 31;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php
deleted file mode 100644
index 37d62fc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedArrayTypeCoercion.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedArrayTypeCoercion extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 195;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php
deleted file mode 100644
index 872cb2e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedAssignment.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedAssignment extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 32;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php
deleted file mode 100644
index 51215b2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedClone.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedClone extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 227;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php
deleted file mode 100644
index 98b8888..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedFunctionCall.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedFunctionCall extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 185;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php
deleted file mode 100644
index f8d2a3d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedInferredReturnType.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedInferredReturnType extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 47;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php
deleted file mode 100644
index 2274b07..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssue.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-interface MixedIssue
-{
- public function getMixedOriginMessage(): string;
-
- public function getOriginalLocation(): ?CodeLocation;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php
deleted file mode 100644
index 62d9609..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedIssueTrait.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-trait MixedIssueTrait
-{
- /**
- * @var ?CodeLocation
- * @readonly
- */
- public $origin_location;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- ?CodeLocation $origin_location = null
- ) {
- $this->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 7b8f97f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedMethodCall.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedMethodCall extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 15;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php
deleted file mode 100644
index 6dbe55e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedOperand.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedOperand extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 59;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php
deleted file mode 100644
index c0e3ec7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyAssignment.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedPropertyAssignment extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 33;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php
deleted file mode 100644
index 7544948..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyFetch.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedPropertyFetch extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 34;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php
deleted file mode 100644
index 56d884f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedPropertyTypeCoercion.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class MixedPropertyTypeCoercion extends PropertyIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 196;
-
- use MixedIssueTrait;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $property_id,
- ?CodeLocation $origin_location = null
- ) {
- parent::__construct($message, $code_location, $property_id);
- $this->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 7a699d4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnStatement.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedReturnStatement extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 138;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php
deleted file mode 100644
index 7ef413f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedReturnTypeCoercion.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedReturnTypeCoercion extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 197;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php
deleted file mode 100644
index ab0b7af..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MixedStringOffsetAssignment.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MixedStringOffsetAssignment extends CodeIssue implements MixedIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 35;
-
- use MixedIssueTrait;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php
deleted file mode 100644
index 1942b78..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificImplementedParamType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MoreSpecificImplementedParamType extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 140;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php b/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php
deleted file mode 100644
index 725e648..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MoreSpecificReturnType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MoreSpecificReturnType extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 70;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php b/vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php
deleted file mode 100644
index a76a4be..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/MutableDependency.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class MutableDependency extends CodeIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 222;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php b/vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php
deleted file mode 100644
index 5699367..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NamedArgumentNotAllowed.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NamedArgumentNotAllowed extends ArgumentIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 268;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php b/vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php
deleted file mode 100644
index 825c654..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NoEnumProperties.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NoEnumProperties extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 301;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php b/vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php
deleted file mode 100644
index d265817..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NoInterfaceProperties.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NoInterfaceProperties extends ClassIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 28;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php
deleted file mode 100644
index fa92bac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NoValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NoValue extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 179;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php b/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php
deleted file mode 100644
index a7fcc53..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantDocblockPropertyType.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Issue;
-
-final class NonInvariantDocblockPropertyType extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 267;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php b/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php
deleted file mode 100644
index 604ee8b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NonInvariantPropertyType.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Issue;
-
-final class NonInvariantPropertyType extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 265;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php
deleted file mode 100644
index 11e9d39..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NonStaticSelfCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NonStaticSelfCall extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 63;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php
deleted file mode 100644
index 65bc81b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 57;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php
deleted file mode 100644
index 6d9d216..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayAccess.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from NullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class NullArrayAccess extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 52;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php
deleted file mode 100644
index d4527a5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 124;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php
deleted file mode 100644
index ccc0a55..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 93;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php
deleted file mode 100644
index 8d26e75..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullIterator.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullIterator extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 96;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php
deleted file mode 100644
index bb063d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 61;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php
deleted file mode 100644
index a1ed010..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyAssignment.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from NullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class NullPropertyAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 36;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php
deleted file mode 100644
index bd1d53b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullPropertyFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from NullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class NullPropertyFetch extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 27;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php
deleted file mode 100644
index c3fafb2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullReference.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullReference extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 16;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php
deleted file mode 100644
index 741428b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/NullableReturnStatement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class NullableReturnStatement extends CodeIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 139;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php
deleted file mode 100644
index 0e97bde..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenMethodAccess.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class OverriddenMethodAccess extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 66;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php
deleted file mode 100644
index 91fa075..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/OverriddenPropertyAccess.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class OverriddenPropertyAccess extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 159;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php b/vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php
deleted file mode 100644
index 0f3dd8d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ParadoxicalCondition.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ParadoxicalCondition extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 89;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php
deleted file mode 100644
index b7e9b67..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ParamNameMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ParamNameMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 230;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php b/vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php
deleted file mode 100644
index 79b0f5b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ParentNotFound.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ParentNotFound extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 17;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php b/vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php
deleted file mode 100644
index 928e0d8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ParseError.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ParseError extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 173;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php
deleted file mode 100644
index 826a1f7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PluginIssue.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-abstract class PluginIssue extends CodeIssue
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php
deleted file mode 100644
index b47e994..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossibleRawObjectIteration.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossibleRawObjectIteration extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 208;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php
deleted file mode 100644
index e3bc78b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyFalseArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 104;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php
deleted file mode 100644
index 324d823..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseIterator.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyFalseIterator extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 164;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php
deleted file mode 100644
index 36a63db..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyFalseOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 162;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php
deleted file mode 100644
index 32ad0df..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyFalsePropertyAssignmentValue extends PropertyIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 146;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php
deleted file mode 100644
index 7549348..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyFalseReference.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyFalseReference extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 105;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php
deleted file mode 100644
index 197dc9f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 92;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php
deleted file mode 100644
index 856570c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAccess.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidArrayAccess extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 109;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php
deleted file mode 100644
index d92eeef..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidArrayAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 118;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php
deleted file mode 100644
index 242b62e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 116;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php
deleted file mode 100644
index fb96bcf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidCast.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidCast extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 190;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php
deleted file mode 100644
index ce0d9ba..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidClone.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidClone extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 226;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php
deleted file mode 100644
index 6632167..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidDocblockTag.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidDocblockTag extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 270;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php
deleted file mode 100644
index e790351..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 136;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php
deleted file mode 100644
index ec41f99..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidIterator.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidIterator extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 165;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php
deleted file mode 100644
index b146605..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidMethodCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidMethodCall extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 113;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php
deleted file mode 100644
index 8befba3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 163;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php
deleted file mode 100644
index fc4d247..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidPropertyAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 112;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php
deleted file mode 100644
index c78ee9f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidPropertyAssignmentValue extends PropertyIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 147;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php
deleted file mode 100644
index 54c2900..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyInvalidPropertyFetch extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 114;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php
deleted file mode 100644
index 8d367f9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArgument.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullArgument extends ArgumentIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 78;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php
deleted file mode 100644
index 7d9481d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAccess.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from PossiblyNullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class PossiblyNullArrayAccess extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 79;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php
deleted file mode 100644
index c32cc3b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullArrayAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 120;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php
deleted file mode 100644
index c32613a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 125;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php
deleted file mode 100644
index 2ec3485..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 94;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php
deleted file mode 100644
index ac3ec4c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullIterator.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullIterator extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 97;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php
deleted file mode 100644
index d575e2e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullOperand.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullOperand extends CodeIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 80;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php
deleted file mode 100644
index a026fea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignment.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from PossiblyNullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class PossiblyNullPropertyAssignment extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 81;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php
deleted file mode 100644
index d1b117b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullPropertyAssignmentValue extends PropertyIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 148;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php
deleted file mode 100644
index 59a3ba2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullPropertyFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-/**
- * This is different from PossiblyNullReference, as PHP throws a notice (vs the possibility of a fatal error with a null
- * reference)
- */
-class PossiblyNullPropertyFetch extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 82;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php
deleted file mode 100644
index ab6c55e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyNullReference.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyNullReference extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 83;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php
deleted file mode 100644
index 5a6dd60..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 167;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php
deleted file mode 100644
index 925a712..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedGlobalVariable extends VariableIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 126;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php
deleted file mode 100644
index f83b3c6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedIntArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 215;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php
deleted file mode 100644
index 15c78fd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 108;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php
deleted file mode 100644
index aa8192d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedStringArrayOffset extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 216;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php
deleted file mode 100644
index c140f36..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUndefinedVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUndefinedVariable extends CodeIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 18;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php
deleted file mode 100644
index 40bf48e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUnusedMethod extends MethodIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 87;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php
deleted file mode 100644
index 0129acc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedParam.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUnusedParam extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 134;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php
deleted file mode 100644
index f876112..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUnusedProperty extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 149;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php
deleted file mode 100644
index 3f8a74a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PossiblyUnusedReturnValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PossiblyUnusedReturnValue extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 273;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php
deleted file mode 100644
index f64cd6c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyIssue.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-abstract class PropertyIssue extends CodeIssue
-{
- /**
- * @var string
- */
- public $property_id;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $property_id
- ) {
- parent::__construct($message, $code_location);
- $this->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 85602e6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyNotSetInConstructor.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class PropertyNotSetInConstructor extends PropertyIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 74;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $property_id
- ) {
- parent::__construct($message, $code_location, $property_id);
- $this->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 c15e00a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PropertyTypeCoercion.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PropertyTypeCoercion extends PropertyIssue
-{
- public const ERROR_LEVEL = 3;
- public const SHORTCODE = 198;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php b/vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php
deleted file mode 100644
index 42c003d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/PsalmInternalError.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class PsalmInternalError extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 177;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php b/vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php
deleted file mode 100644
index 4289be8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RawObjectIteration.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RawObjectIteration extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 111;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php
deleted file mode 100644
index 915d10a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCast.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantCast extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 262;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php
deleted file mode 100644
index 501ac9c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCastGivenDocblockType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantCastGivenDocblockType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 263;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php
deleted file mode 100644
index abb4df4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantCondition.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class RedundantCondition extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 122;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
- $this->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 a60adf6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantConditionGivenDocblockType.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class RedundantConditionGivenDocblockType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 156;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
-
- $this->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 d84d0a4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantFunctionCall extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 280;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php
deleted file mode 100644
index 659679c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantFunctionCallGivenDocblockType extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 281;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php
deleted file mode 100644
index a84188a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantIdentityWithTrue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantIdentityWithTrue extends CodeIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 228;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php b/vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php
deleted file mode 100644
index 26bdf4b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/RedundantPropertyInitializationCheck.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class RedundantPropertyInitializationCheck extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 261;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php b/vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php
deleted file mode 100644
index 108ebdd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ReferenceConstraintViolation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ReferenceConstraintViolation extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 86;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php b/vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php
deleted file mode 100644
index 6ea884f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/ReservedWord.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class ReservedWord extends ClassIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 95;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php b/vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php
deleted file mode 100644
index 4984f97..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/StringIncrement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class StringIncrement extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 211;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php
deleted file mode 100644
index d20f576..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCallable.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedCallable extends TaintedInput
-{
- public const SHORTCODE = 243;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php
deleted file mode 100644
index c96d88f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCookie.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedCookie extends TaintedInput
-{
- public const SHORTCODE = 257;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php
deleted file mode 100644
index 338812b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedCustom.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedCustom extends TaintedInput
-{
- public const SHORTCODE = 249;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php
deleted file mode 100644
index bb41a5e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedEval.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedEval extends TaintedInput
-{
- public const SHORTCODE = 252;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php
deleted file mode 100644
index 4e8c43d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedFile.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedFile extends TaintedInput
-{
- public const SHORTCODE = 255;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php
deleted file mode 100644
index e4c02c9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHeader.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedHeader extends TaintedInput
-{
- public const SHORTCODE = 256;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php
deleted file mode 100644
index 33fa28e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedHtml.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedHtml extends TaintedInput
-{
- public const SHORTCODE = 245;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php
deleted file mode 100644
index da23878..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInclude.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedInclude extends TaintedInput
-{
- public const SHORTCODE = 251;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php
deleted file mode 100644
index fab38e5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedInput.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\DataFlowNodeData;
-
-abstract class TaintedInput extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 205;
-
- /**
- * @var string
- * @readonly
- */
- public $journey_text;
-
- /**
- * @var list<array{location: ?CodeLocation, label: string, entry_path_type: string}>
- * @readonly
- */
- public $journey = [];
-
- /**
- * @param list<array{location: ?CodeLocation, label: string, entry_path_type: string}> $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<DataFlowNodeData|array{label: string, entry_path_type: string}>
- */
- 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 37349c9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedLdap.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedLdap extends TaintedInput
-{
- public const SHORTCODE = 254;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php
deleted file mode 100644
index 51d4773..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSSRF.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedSSRF extends TaintedInput
-{
- public const SHORTCODE = 253;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php
deleted file mode 100644
index eea44a6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedShell.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedShell extends TaintedInput
-{
- public const SHORTCODE = 246;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php
deleted file mode 100644
index c5fc7ff..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSql.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedSql extends TaintedInput
-{
- public const SHORTCODE = 244;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php
deleted file mode 100644
index a3d0210..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedSystemSecret.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedSystemSecret extends TaintedInput
-{
- public const SHORTCODE = 248;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php
deleted file mode 100644
index 100f501..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedTextWithQuotes.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedTextWithQuotes extends TaintedInput
-{
- public const SHORTCODE = 274;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php
deleted file mode 100644
index 2217b42..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUnserialize.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedUnserialize extends TaintedInput
-{
- public const SHORTCODE = 250;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php b/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php
deleted file mode 100644
index 7ab6e59..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TaintedUserSecret.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TaintedUserSecret extends TaintedInput
-{
- public const SHORTCODE = 247;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php b/vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php
deleted file mode 100644
index cc98d15..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TooFewArguments.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TooFewArguments extends ArgumentIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 25;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php b/vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php
deleted file mode 100644
index f271bfc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TooManyArguments.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TooManyArguments extends ArgumentIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 26;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php b/vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php
deleted file mode 100644
index d5654e5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TooManyTemplateParams.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TooManyTemplateParams extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 184;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/Trace.php b/vendor/vimeo/psalm/src/Psalm/Issue/Trace.php
deleted file mode 100644
index 2c4ce12..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/Trace.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class Trace extends CodeIssue
-{
- public const ERROR_LEVEL = 1;
- public const SHORTCODE = 224;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php b/vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php
deleted file mode 100644
index b9a322d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TraitMethodSignatureMismatch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class TraitMethodSignatureMismatch extends CodeIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 192;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php b/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php
deleted file mode 100644
index 9a9aa32..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainNull.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class TypeDoesNotContainNull extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 90;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
- $this->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 a496b5d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/TypeDoesNotContainType.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-class TypeDoesNotContainType extends CodeIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 56;
-
- public function __construct(string $message, CodeLocation $code_location, ?string $dupe_key)
- {
- parent::__construct($message, $code_location);
- $this->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 f5301c2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UncaughtThrowInGlobalScope.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UncaughtThrowInGlobalScope extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 191;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php
deleted file mode 100644
index e8ed215..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedAttributeClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedAttributeClass extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 241;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php
deleted file mode 100644
index a71a151..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedClass extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 19;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php
deleted file mode 100644
index 0b8330f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedConstant.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedConstant extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 20;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php
deleted file mode 100644
index a108e53..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedDocblockClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedDocblockClass extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 200;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php
deleted file mode 100644
index 8524cef..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedFunction.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedFunction extends FunctionIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 21;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php
deleted file mode 100644
index b68a765..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedGlobalVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedGlobalVariable extends VariableIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 127;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php
deleted file mode 100644
index 8f8024e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterface.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedInterface extends ClassIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 189;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php
deleted file mode 100644
index 5dd1fec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedInterfaceMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedInterfaceMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 181;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php
deleted file mode 100644
index 370bacd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedMagicMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 219;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php
deleted file mode 100644
index b73af35..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedMagicPropertyAssignment extends PropertyIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 217;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php
deleted file mode 100644
index 086d5f8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMagicPropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedMagicPropertyFetch extends PropertyIssue
-{
- public const ERROR_LEVEL = 4;
- public const SHORTCODE = 218;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php
deleted file mode 100644
index f501905..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedMethod extends MethodIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 22;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php
deleted file mode 100644
index 1973814..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedPropertyAssignment extends PropertyIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 38;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php
deleted file mode 100644
index abaa311..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedPropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedPropertyFetch extends PropertyIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 39;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php
deleted file mode 100644
index d713fec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyAssignment.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedThisPropertyAssignment extends PropertyIssue
-{
- public const ERROR_LEVEL = 5;
- public const SHORTCODE = 40;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php
deleted file mode 100644
index b166954..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedThisPropertyFetch.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedThisPropertyFetch extends PropertyIssue
-{
- public const ERROR_LEVEL = 6;
- public const SHORTCODE = 41;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php
deleted file mode 100644
index a32113f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrace.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedTrace extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 225;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php
deleted file mode 100644
index 38d6813..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedTrait.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedTrait extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 23;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php
deleted file mode 100644
index 5d6644a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UndefinedVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UndefinedVariable extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 24;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php
deleted file mode 100644
index 0a98929..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnevaluatedCode.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnevaluatedCode extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 84;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php
deleted file mode 100644
index 0edeaf5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnhandledMatchCondition.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnhandledMatchCondition extends CodeIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 236;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php
deleted file mode 100644
index ebe6afa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedAbstractMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnimplementedAbstractMethod extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 101;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php
deleted file mode 100644
index 8ed4307..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnimplementedInterfaceMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnimplementedInterfaceMethod extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 44;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php
deleted file mode 100644
index 5b60ef5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UninitializedProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UninitializedProperty extends PropertyIssue
-{
- public const ERROR_LEVEL = 7;
- public const SHORTCODE = 186;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php
deleted file mode 100644
index 430c262..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnnecessaryVarAnnotation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnnecessaryVarAnnotation extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 212;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php
deleted file mode 100644
index 6246175..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedExpression.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnrecognizedExpression extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 48;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php
deleted file mode 100644
index 2615040..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnrecognizedStatement.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnrecognizedStatement extends CodeIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 49;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php
deleted file mode 100644
index 8491662..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnresolvableInclude.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnresolvableInclude extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 106;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php
deleted file mode 100644
index 7d75fd9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeGenericInstantiation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnsafeGenericInstantiation extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 269;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php
deleted file mode 100644
index 321334b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnsafeInstantiation.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnsafeInstantiation extends CodeIssue
-{
- public const ERROR_LEVEL = 2;
- public const SHORTCODE = 229;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php
deleted file mode 100644
index 7fbeab2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClass.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedClass extends ClassIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 75;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php
deleted file mode 100644
index 7a2ad8e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedClosureParam.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedClosureParam extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 188;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php
deleted file mode 100644
index f29794d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedConstructor.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedConstructor extends MethodIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 258;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php
deleted file mode 100644
index 3fbf17e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedForeachValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedForeachValue extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 275;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php
deleted file mode 100644
index 257a9b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedFunctionCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedFunctionCall extends FunctionIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 206;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php
deleted file mode 100644
index 35ac22c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethod.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedMethod extends MethodIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 76;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php
deleted file mode 100644
index 2ed355a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedMethodCall.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedMethodCall extends MethodIssue
-{
- public const ERROR_LEVEL = -1;
- public const SHORTCODE = 209;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php
deleted file mode 100644
index f67273b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedParam.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedParam extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 135;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php
deleted file mode 100644
index 3f25a3c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedProperty.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedProperty extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 150;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php
deleted file mode 100644
index edeab55..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedPsalmSuppress.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedPsalmSuppress extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 207;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php
deleted file mode 100644
index 95daec9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedReturnValue.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedReturnValue extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 272;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php b/vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php
deleted file mode 100644
index ff4ee9e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/UnusedVariable.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-class UnusedVariable extends CodeIssue
-{
- public const ERROR_LEVEL = -2;
- public const SHORTCODE = 77;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php b/vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php
deleted file mode 100644
index 1a953cc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Issue/VariableIssue.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Issue;
-
-use Psalm\CodeLocation;
-
-use function strtolower;
-
-abstract class VariableIssue extends CodeIssue
-{
- /**
- * @var string
- */
- public $var_name;
-
- public function __construct(
- string $message,
- CodeLocation $code_location,
- string $var_name
- ) {
- parent::__construct($message, $code_location);
- $this->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 47bde92..0000000
--- a/vendor/vimeo/psalm/src/Psalm/IssueBuffer.php
+++ /dev/null
@@ -1,1029 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Psalm\CodeLocation\Raw;
-use Psalm\Exception\CodeException;
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Analyzer\ProjectAnalyzer;
-use Psalm\Internal\ExecutionEnvironment\BuildInfoCollector;
-use Psalm\Internal\ExecutionEnvironment\GitInfoCollector;
-use Psalm\Internal\Provider\FileProvider;
-use Psalm\Issue\CodeIssue;
-use Psalm\Issue\ConfigIssue;
-use Psalm\Issue\MixedIssue;
-use Psalm\Issue\TaintedInput;
-use Psalm\Issue\UnusedPsalmSuppress;
-use Psalm\Plugin\EventHandler\Event\AfterAnalysisEvent;
-use Psalm\Report\CheckstyleReport;
-use Psalm\Report\CodeClimateReport;
-use Psalm\Report\CompactReport;
-use Psalm\Report\ConsoleReport;
-use Psalm\Report\CountReport;
-use Psalm\Report\EmacsReport;
-use Psalm\Report\GithubActionsReport;
-use Psalm\Report\JsonReport;
-use Psalm\Report\JsonSummaryReport;
-use Psalm\Report\JunitReport;
-use Psalm\Report\PhpStormReport;
-use Psalm\Report\PylintReport;
-use Psalm\Report\ReportOptions;
-use Psalm\Report\SarifReport;
-use Psalm\Report\SonarqubeReport;
-use Psalm\Report\TextReport;
-use Psalm\Report\XmlReport;
-use RuntimeException;
-use UnexpectedValueException;
-
-use function array_keys;
-use function array_merge;
-use function array_pop;
-use function array_search;
-use function array_splice;
-use function array_sum;
-use function array_values;
-use function arsort;
-use function count;
-use function debug_print_backtrace;
-use function dirname;
-use function explode;
-use function file_put_contents;
-use function fwrite;
-use function get_class;
-use function implode;
-use function in_array;
-use function is_dir;
-use function is_int;
-use function ksort;
-use function memory_get_peak_usage;
-use function microtime;
-use function mkdir;
-use function number_format;
-use function ob_get_clean;
-use function ob_start;
-use function preg_match;
-use function round;
-use function sha1;
-use function sprintf;
-use function str_repeat;
-use function str_replace;
-use function strlen;
-use function strpos;
-use function trim;
-use function usort;
-
-use const DEBUG_BACKTRACE_IGNORE_ARGS;
-use const PSALM_VERSION;
-use const STDERR;
-
-class IssueBuffer
-{
- /**
- * @var array<string, list<IssueData>>
- */
- protected static $issues_data = [];
-
- /**
- * @var array<int, array>
- */
- protected static $console_issues = [];
-
- /**
- * @var array<string, int>
- */
- protected static $fixable_issue_counts = [];
-
- /**
- * @var int
- */
- protected static $error_count = 0;
-
- /**
- * @var array<string, bool>
- */
- protected static $emitted = [];
-
- /** @var int */
- protected static $recording_level = 0;
-
- /** @var array<int, array<int, CodeIssue>> */
- protected static $recorded_issues = [];
-
- /**
- * @var array<string, array<int, int>>
- */
- protected static $unused_suppressions = [];
-
- /**
- * @var array<string, array<int, bool>>
- */
- protected static $used_suppressions = [];
-
- /** @var array<array-key,mixed> */
- 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<string, list<IssueData>>
- */
- public static function getIssuesData(): array
- {
- return self::$issues_data;
- }
-
- /**
- * @return list<IssueData>
- */
- public static function getIssuesDataForFile(string $file_path): array
- {
- return self::$issues_data[$file_path] ?? [];
- }
-
- /**
- * @return array<string, int>
- */
- public static function getFixableIssues(): array
- {
- return self::$fixable_issue_counts;
- }
-
- /**
- * @param array<string, int> $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<string, array<int, int>>
- */
- public static function getUnusedSuppressions(): array
- {
- return self::$unused_suppressions;
- }
-
- /**
- * @return array<string, array<int, bool>>
- */
- public static function getUsedSuppressions(): array
- {
- return self::$used_suppressions;
- }
-
- /**
- * @param array<string, array<int, int>> $unused_suppressions
- */
- public static function addUnusedSuppressions(array $unused_suppressions): void
- {
- self::$unused_suppressions += $unused_suppressions;
- }
-
- /**
- * @param array<string, array<int, bool>> $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<string, list<IssueData>> $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<string,array<string,array{o:int, s:array<int, string>}>> $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<string, array<int, IssueData>> $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<string, list<IssueData>>
- */
- 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<int, CodeIssue>
- */
- 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<array-key,mixed> $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 9c28c1e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\BitwiseAnd;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseAnd extends BitwiseAnd implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php
deleted file mode 100644
index ce662bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\BitwiseOr;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseOr extends BitwiseOr implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php
deleted file mode 100644
index da05552..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\BitwiseXor;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseXor extends BitwiseXor implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php
deleted file mode 100644
index 392a699..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Coalesce;
-use Psalm\Node\VirtualNode;
-
-class VirtualCoalesce extends Coalesce implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php
deleted file mode 100644
index 572c06b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Concat;
-use Psalm\Node\VirtualNode;
-
-class VirtualConcat extends Concat implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php
deleted file mode 100644
index fa4d86c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Div;
-use Psalm\Node\VirtualNode;
-
-class VirtualDiv extends Div implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php
deleted file mode 100644
index d535aab..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Minus;
-use Psalm\Node\VirtualNode;
-
-class VirtualMinus extends Minus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php
deleted file mode 100644
index 79805b0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMod.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Mod;
-use Psalm\Node\VirtualNode;
-
-class VirtualMod extends Mod implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php
deleted file mode 100644
index bc0c1ea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualMul.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Mul;
-use Psalm\Node\VirtualNode;
-
-class VirtualMul extends Mul implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php
deleted file mode 100644
index f6abbaa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Plus;
-use Psalm\Node\VirtualNode;
-
-class VirtualPlus extends Plus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php
deleted file mode 100644
index d0e3faa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualPow.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\Pow;
-use Psalm\Node\VirtualNode;
-
-class VirtualPow extends Pow implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php
deleted file mode 100644
index 6dd915e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\ShiftLeft;
-use Psalm\Node\VirtualNode;
-
-class VirtualShiftLeft extends ShiftLeft implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php
deleted file mode 100644
index 010ea4f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\AssignOp;
-
-use PhpParser\Node\Expr\AssignOp\ShiftRight;
-use Psalm\Node\VirtualNode;
-
-class VirtualShiftRight extends ShiftRight implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php
deleted file mode 100644
index 98a12d1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\BitwiseAnd;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseAnd extends BitwiseAnd implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php
deleted file mode 100644
index 750fce6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\BitwiseOr;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseOr extends BitwiseOr implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php
deleted file mode 100644
index cb7f55f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\BitwiseXor;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseXor extends BitwiseXor implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php
deleted file mode 100644
index 1252377..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\BooleanAnd;
-use Psalm\Node\VirtualNode;
-
-class VirtualBooleanAnd extends BooleanAnd implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php
deleted file mode 100644
index c9a5b1d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\BooleanOr;
-use Psalm\Node\VirtualNode;
-
-class VirtualBooleanOr extends BooleanOr implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php
deleted file mode 100644
index cd6da25..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Coalesce;
-use Psalm\Node\VirtualNode;
-
-class VirtualCoalesce extends Coalesce implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php
deleted file mode 100644
index 1fe7274..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Concat;
-use Psalm\Node\VirtualNode;
-
-class VirtualConcat extends Concat implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php
deleted file mode 100644
index efbf5c5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Div;
-use Psalm\Node\VirtualNode;
-
-class VirtualDiv extends Div implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php
deleted file mode 100644
index c02decd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Equal;
-use Psalm\Node\VirtualNode;
-
-class VirtualEqual extends Equal implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php
deleted file mode 100644
index 3caae8f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Greater;
-use Psalm\Node\VirtualNode;
-
-class VirtualGreater extends Greater implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php
deleted file mode 100644
index 3fa9224..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual;
-use Psalm\Node\VirtualNode;
-
-class VirtualGreaterOrEqual extends GreaterOrEqual implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php
deleted file mode 100644
index b680abd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Identical;
-use Psalm\Node\VirtualNode;
-
-class VirtualIdentical extends Identical implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php
deleted file mode 100644
index 27c7798..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\LogicalAnd;
-use Psalm\Node\VirtualNode;
-
-class VirtualLogicalAnd extends LogicalAnd implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php
deleted file mode 100644
index daea5b3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\LogicalOr;
-use Psalm\Node\VirtualNode;
-
-class VirtualLogicalOr extends LogicalOr implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php
deleted file mode 100644
index 3e7fe93..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\LogicalXor;
-use Psalm\Node\VirtualNode;
-
-class VirtualLogicalXor extends LogicalXor implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php
deleted file mode 100644
index c26353b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Minus;
-use Psalm\Node\VirtualNode;
-
-class VirtualMinus extends Minus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php
deleted file mode 100644
index 3daadb3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Mod;
-use Psalm\Node\VirtualNode;
-
-class VirtualMod extends Mod implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php
deleted file mode 100644
index bba1aaf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Mul;
-use Psalm\Node\VirtualNode;
-
-class VirtualMul extends Mul implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php
deleted file mode 100644
index 4d1c436..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\NotEqual;
-use Psalm\Node\VirtualNode;
-
-class VirtualNotEqual extends NotEqual implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php
deleted file mode 100644
index 12b907c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\NotIdentical;
-use Psalm\Node\VirtualNode;
-
-class VirtualNotIdentical extends NotIdentical implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php
deleted file mode 100644
index 2376af4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Plus;
-use Psalm\Node\VirtualNode;
-
-class VirtualPlus extends Plus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php
deleted file mode 100644
index 680a4cb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Pow;
-use Psalm\Node\VirtualNode;
-
-class VirtualPow extends Pow implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php
deleted file mode 100644
index 86bbe40..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\ShiftLeft;
-use Psalm\Node\VirtualNode;
-
-class VirtualShiftLeft extends ShiftLeft implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php
deleted file mode 100644
index 9cc94a1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\ShiftRight;
-use Psalm\Node\VirtualNode;
-
-class VirtualShiftRight extends ShiftRight implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php
deleted file mode 100644
index 20e2ca5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Smaller;
-use Psalm\Node\VirtualNode;
-
-class VirtualSmaller extends Smaller implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php
deleted file mode 100644
index 9c4d93e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual;
-use Psalm\Node\VirtualNode;
-
-class VirtualSmallerOrEqual extends SmallerOrEqual implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php
deleted file mode 100644
index 01c5a44..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\BinaryOp;
-
-use PhpParser\Node\Expr\BinaryOp\Spaceship;
-use Psalm\Node\VirtualNode;
-
-class VirtualSpaceship extends Spaceship implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php
deleted file mode 100644
index ca5b8ff..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualArray.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Array_;
-use Psalm\Node\VirtualNode;
-
-class VirtualArray extends Array_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php
deleted file mode 100644
index 94fde38..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualBool.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Bool_;
-use Psalm\Node\VirtualNode;
-
-class VirtualBool extends Bool_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php
deleted file mode 100644
index aebf5a8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualDouble.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Double;
-use Psalm\Node\VirtualNode;
-
-class VirtualDouble extends Double implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php
deleted file mode 100644
index c389a77..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualInt.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Int_;
-use Psalm\Node\VirtualNode;
-
-class VirtualInt extends Int_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php
deleted file mode 100644
index 4846b72..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualObject.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Object_;
-use Psalm\Node\VirtualNode;
-
-class VirtualObject extends Object_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php
deleted file mode 100644
index 31e66c6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualString.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\String_;
-use Psalm\Node\VirtualNode;
-
-class VirtualString extends String_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php
deleted file mode 100644
index 52ad1c6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/Cast/VirtualUnset.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr\Cast;
-
-use PhpParser\Node\Expr\Cast\Unset_;
-use Psalm\Node\VirtualNode;
-
-class VirtualUnset extends Unset_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php
deleted file mode 100644
index c75e906..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArray.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Array_;
-use Psalm\Node\VirtualNode;
-
-class VirtualArray extends Array_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php
deleted file mode 100644
index 7d7236e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayDimFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ArrayDimFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualArrayDimFetch extends ArrayDimFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php
deleted file mode 100644
index 844fab8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrayItem.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ArrayItem;
-use Psalm\Node\VirtualNode;
-
-class VirtualArrayItem extends ArrayItem implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php
deleted file mode 100644
index 07b4f70..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualArrowFunction.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ArrowFunction;
-use Psalm\Node\VirtualNode;
-
-class VirtualArrowFunction extends ArrowFunction implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php
deleted file mode 100644
index 334beb9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssign.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Assign;
-use Psalm\Node\VirtualNode;
-
-class VirtualAssign extends Assign implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php
deleted file mode 100644
index 52424e4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualAssignRef.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\AssignRef;
-use Psalm\Node\VirtualNode;
-
-class VirtualAssignRef extends AssignRef implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php
deleted file mode 100644
index 203a67c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBitwiseNot.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\BitwiseNot;
-use Psalm\Node\VirtualNode;
-
-class VirtualBitwiseNot extends BitwiseNot implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php
deleted file mode 100644
index cadf6a6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualBooleanNot.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\BooleanNot;
-use Psalm\Node\VirtualNode;
-
-class VirtualBooleanNot extends BooleanNot implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php
deleted file mode 100644
index 7cc8bcc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClassConstFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ClassConstFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualClassConstFetch extends ClassConstFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php
deleted file mode 100644
index 93c052c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClone.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Clone_;
-use Psalm\Node\VirtualNode;
-
-class VirtualClone extends Clone_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php
deleted file mode 100644
index 9991155..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosure.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Closure;
-use Psalm\Node\VirtualNode;
-
-class VirtualClosure extends Closure implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php
deleted file mode 100644
index 1fce5ac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualClosureUse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ClosureUse;
-use Psalm\Node\VirtualNode;
-
-class VirtualClosureUse extends ClosureUse implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php
deleted file mode 100644
index 2e241df..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualConstFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ConstFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualConstFetch extends ConstFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php
deleted file mode 100644
index a1e72c9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEmpty.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Empty_;
-use Psalm\Node\VirtualNode;
-
-class VirtualEmpty extends Empty_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php
deleted file mode 100644
index 1a4913c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualError.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Error;
-use Psalm\Node\VirtualNode;
-
-/**
- * Error node used during parsing with error recovery.
- *
- * An error node may be placed at a position where an expression is required, but an error occurred.
- * Error nodes will not be present if the parser is run in throwOnError mode (the default).
- */
-class VirtualError extends Error implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php
deleted file mode 100644
index 2a1d31e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualErrorSuppress.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ErrorSuppress;
-use Psalm\Node\VirtualNode;
-
-class VirtualErrorSuppress extends ErrorSuppress implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php
deleted file mode 100644
index 6e77cad..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualEval.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Eval_;
-use Psalm\Node\VirtualNode;
-
-class VirtualEval extends Eval_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php
deleted file mode 100644
index 0a9c250..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualExit.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Exit_;
-use Psalm\Node\VirtualNode;
-
-class VirtualExit extends Exit_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php
deleted file mode 100644
index 7c27caa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualFuncCall.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\FuncCall;
-use Psalm\Node\VirtualNode;
-
-class VirtualFuncCall extends FuncCall implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php
deleted file mode 100644
index b1cace6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInclude.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Include_;
-use Psalm\Node\VirtualNode;
-
-class VirtualInclude extends Include_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php
deleted file mode 100644
index 5fc6af3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualInstanceof.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Instanceof_;
-use Psalm\Node\VirtualNode;
-
-class VirtualInstanceof extends Instanceof_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php
deleted file mode 100644
index 2bb803f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualIsset.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Isset_;
-use Psalm\Node\VirtualNode;
-
-class VirtualIsset extends Isset_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php
deleted file mode 100644
index 480b913..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualList.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\List_;
-use Psalm\Node\VirtualNode;
-
-class VirtualList extends List_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php
deleted file mode 100644
index 4f5f054..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMatch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Match_;
-use Psalm\Node\VirtualNode;
-
-class VirtualMatch extends Match_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php
deleted file mode 100644
index 98f191c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualMethodCall.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\MethodCall;
-use Psalm\Node\VirtualNode;
-
-class VirtualMethodCall extends MethodCall implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php
deleted file mode 100644
index 72c4a08..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNew.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\New_;
-use Psalm\Node\VirtualNode;
-
-class VirtualNew extends New_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php
deleted file mode 100644
index 747ae55..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\NullsafeMethodCall;
-use Psalm\Node\VirtualNode;
-
-class VirtualNullsafeMethodCall extends NullsafeMethodCall implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php
deleted file mode 100644
index d30612c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\NullsafePropertyFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualNullsafePropertyFetch extends NullsafePropertyFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php
deleted file mode 100644
index 7958eb3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostDec.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\PostDec;
-use Psalm\Node\VirtualNode;
-
-class VirtualPostDec extends PostDec implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php
deleted file mode 100644
index 80b3efe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPostInc.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\PostInc;
-use Psalm\Node\VirtualNode;
-
-class VirtualPostInc extends PostInc implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php
deleted file mode 100644
index 4c93efb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreDec.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\PreDec;
-use Psalm\Node\VirtualNode;
-
-class VirtualPreDec extends PreDec implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php
deleted file mode 100644
index 48e81f0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPreInc.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\PreInc;
-use Psalm\Node\VirtualNode;
-
-class VirtualPreInc extends PreInc implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php
deleted file mode 100644
index 61967ac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPrint.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Print_;
-use Psalm\Node\VirtualNode;
-
-class VirtualPrint extends Print_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php
deleted file mode 100644
index 726da5c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualPropertyFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\PropertyFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualPropertyFetch extends PropertyFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php
deleted file mode 100644
index 5bb8ebf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualShellExec.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\ShellExec;
-use Psalm\Node\VirtualNode;
-
-class VirtualShellExec extends ShellExec implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php
deleted file mode 100644
index a778038..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticCall.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\StaticCall;
-use Psalm\Node\VirtualNode;
-
-class VirtualStaticCall extends StaticCall implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php
deleted file mode 100644
index 2eb250e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\StaticPropertyFetch;
-use Psalm\Node\VirtualNode;
-
-class VirtualStaticPropertyFetch extends StaticPropertyFetch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php
deleted file mode 100644
index 9fd226a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualTernary.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Ternary;
-use Psalm\Node\VirtualNode;
-
-class VirtualTernary extends Ternary implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php
deleted file mode 100644
index f6a4772..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualThrow.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Throw_;
-use Psalm\Node\VirtualNode;
-
-class VirtualThrow extends Throw_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php
deleted file mode 100644
index 599baf4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryMinus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\UnaryMinus;
-use Psalm\Node\VirtualNode;
-
-class VirtualUnaryMinus extends UnaryMinus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php
deleted file mode 100644
index f1e6c3d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualUnaryPlus.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\UnaryPlus;
-use Psalm\Node\VirtualNode;
-
-class VirtualUnaryPlus extends UnaryPlus implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php
deleted file mode 100644
index b1c5344..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualVariable.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Variable;
-use Psalm\Node\VirtualNode;
-
-class VirtualVariable extends Variable implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php
deleted file mode 100644
index 7455c68..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYield.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\Yield_;
-use Psalm\Node\VirtualNode;
-
-class VirtualYield extends Yield_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php b/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php
deleted file mode 100644
index fb7060b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Expr/VirtualYieldFrom.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Expr;
-
-use PhpParser\Node\Expr\YieldFrom;
-use Psalm\Node\VirtualNode;
-
-class VirtualYieldFrom extends YieldFrom implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php b/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php
deleted file mode 100644
index d603628..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualFullyQualified.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Name;
-
-use PhpParser\Node\Name\FullyQualified;
-use Psalm\Node\VirtualNode;
-
-class VirtualFullyQualified extends FullyQualified implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php b/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php
deleted file mode 100644
index a8cf56d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Name/VirtualRelative.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Name;
-
-use PhpParser\Node\Name\Relative;
-use Psalm\Node\VirtualNode;
-
-class VirtualRelative extends Relative implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php
deleted file mode 100644
index ff8ad18..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Class_;
-use Psalm\Node\VirtualNode;
-
-class VirtualClass extends Class_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php
deleted file mode 100644
index 053f516..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Dir;
-use Psalm\Node\VirtualNode;
-
-class VirtualDir extends Dir implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php
deleted file mode 100644
index c9f4cdb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\File;
-use Psalm\Node\VirtualNode;
-
-class VirtualFile extends File implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php
deleted file mode 100644
index 40fef03..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Function_;
-use Psalm\Node\VirtualNode;
-
-class VirtualFunction extends Function_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php
deleted file mode 100644
index b1cea72..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Line;
-use Psalm\Node\VirtualNode;
-
-class VirtualLine extends Line implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php
deleted file mode 100644
index 9298a90..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Method;
-use Psalm\Node\VirtualNode;
-
-class VirtualMethod extends Method implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php
deleted file mode 100644
index 249a989..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Namespace_;
-use Psalm\Node\VirtualNode;
-
-class VirtualNamespace extends Namespace_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php
deleted file mode 100644
index 8acb117..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar\MagicConst;
-
-use PhpParser\Node\Scalar\MagicConst\Trait_;
-use Psalm\Node\VirtualNode;
-
-class VirtualTrait extends Trait_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php
deleted file mode 100644
index a11cb8e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualDNumber.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar;
-
-use PhpParser\Node\Scalar\DNumber;
-use Psalm\Node\VirtualNode;
-
-class VirtualDNumber extends DNumber implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php
deleted file mode 100644
index 11ed441..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsed.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar;
-
-use PhpParser\Node\Scalar\Encapsed;
-use Psalm\Node\VirtualNode;
-
-class VirtualEncapsed extends Encapsed implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php
deleted file mode 100644
index d740bfe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar;
-
-use PhpParser\Node\Scalar\EncapsedStringPart;
-use Psalm\Node\VirtualNode;
-
-class VirtualEncapsedStringPart extends EncapsedStringPart implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php
deleted file mode 100644
index 3dad135..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualLNumber.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar;
-
-use PhpParser\Node\Scalar\LNumber;
-use Psalm\Node\VirtualNode;
-
-class VirtualLNumber extends LNumber implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php b/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php
deleted file mode 100644
index 32704d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Scalar/VirtualString.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Scalar;
-
-use PhpParser\Node\Scalar\String_;
-use Psalm\Node\VirtualNode;
-
-class VirtualString extends String_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php
deleted file mode 100644
index 05ac9cd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt\TraitUseAdaptation;
-
-use PhpParser\Node\Stmt\TraitUseAdaptation\Alias;
-use Psalm\Node\VirtualNode;
-
-class VirtualAlias extends Alias implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php
deleted file mode 100644
index 349f4ec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt\TraitUseAdaptation;
-
-use PhpParser\Node\Stmt\TraitUseAdaptation\Precedence;
-use Psalm\Node\VirtualNode;
-
-class VirtualPrecedence extends Precedence implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php
deleted file mode 100644
index 7444a43..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualBreak.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Break_;
-use Psalm\Node\VirtualNode;
-
-class VirtualBreak extends Break_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php
deleted file mode 100644
index c332b8b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCase.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Case_;
-use Psalm\Node\VirtualNode;
-
-class VirtualCase extends Case_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php
deleted file mode 100644
index 7e9a77b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualCatch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Catch_;
-use Psalm\Node\VirtualNode;
-
-class VirtualCatch extends Catch_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php
deleted file mode 100644
index 0341c78..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClass.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Class_;
-use Psalm\Node\VirtualNode;
-
-class VirtualClass extends Class_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php
deleted file mode 100644
index bdda375..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassConst.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\ClassConst;
-use Psalm\Node\VirtualNode;
-
-class VirtualClassConst extends ClassConst implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php
deleted file mode 100644
index 3fc0c8e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualClassMethod.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\ClassMethod;
-use Psalm\Node\VirtualNode;
-
-class VirtualClassMethod extends ClassMethod implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php
deleted file mode 100644
index f358656..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualConst.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Const_;
-use Psalm\Node\VirtualNode;
-
-class VirtualConst extends Const_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php
deleted file mode 100644
index 99de212..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualContinue.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Continue_;
-use Psalm\Node\VirtualNode;
-
-class VirtualContinue extends Continue_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php
deleted file mode 100644
index 914994e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclare.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Declare_;
-use Psalm\Node\VirtualNode;
-
-class VirtualDeclare extends Declare_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php
deleted file mode 100644
index b71c58f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\DeclareDeclare;
-use Psalm\Node\VirtualNode;
-
-class VirtualDeclareDeclare extends DeclareDeclare implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php
deleted file mode 100644
index 730bbe0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualDo.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Do_;
-use Psalm\Node\VirtualNode;
-
-class VirtualDo extends Do_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php
deleted file mode 100644
index d734136..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualEcho.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Echo_;
-use Psalm\Node\VirtualNode;
-
-class VirtualEcho extends Echo_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php
deleted file mode 100644
index 94e7ad3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Else_;
-use Psalm\Node\VirtualNode;
-
-class VirtualElse extends Else_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php
deleted file mode 100644
index 238f3e7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualElseIf.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\ElseIf_;
-use Psalm\Node\VirtualNode;
-
-class VirtualElseIf extends ElseIf_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php
deleted file mode 100644
index aeeecb0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualExpression.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Expression;
-use Psalm\Node\VirtualNode;
-
-/**
- * Represents statements of type "expr;"
- */
-class VirtualExpression extends Expression implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php
deleted file mode 100644
index fc7f4f9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFinally.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Finally_;
-use Psalm\Node\VirtualNode;
-
-class VirtualFinally extends Finally_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php
deleted file mode 100644
index e748f57..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFor.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\For_;
-use Psalm\Node\VirtualNode;
-
-class VirtualFor extends For_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php
deleted file mode 100644
index 2b384bc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualForeach.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Foreach_;
-use Psalm\Node\VirtualNode;
-
-class VirtualForeach extends Foreach_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php
deleted file mode 100644
index b53e53f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualFunction.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Function_;
-use Psalm\Node\VirtualNode;
-
-class VirtualFunction extends Function_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php
deleted file mode 100644
index bdd258f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGlobal.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Global_;
-use Psalm\Node\VirtualNode;
-
-class VirtualGlobal extends Global_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php
deleted file mode 100644
index af14ffe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGoto.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Goto_;
-use Psalm\Node\VirtualNode;
-
-class VirtualGoto extends Goto_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php
deleted file mode 100644
index 1f373a3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualGroupUse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\GroupUse;
-use Psalm\Node\VirtualNode;
-
-class VirtualGroupUse extends GroupUse implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php
deleted file mode 100644
index 7b444a0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualHaltCompiler.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\HaltCompiler;
-use Psalm\Node\VirtualNode;
-
-class VirtualHaltCompiler extends HaltCompiler implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php
deleted file mode 100644
index 93ad441..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualIf.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\If_;
-use Psalm\Node\VirtualNode;
-
-class VirtualIf extends If_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php
deleted file mode 100644
index 356d6a1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInlineHTML.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\InlineHTML;
-use Psalm\Node\VirtualNode;
-
-class VirtualInlineHTML extends InlineHTML implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php
deleted file mode 100644
index 40e7509..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualInterface.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Interface_;
-use Psalm\Node\VirtualNode;
-
-class VirtualInterface extends Interface_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php
deleted file mode 100644
index 96170a4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualLabel.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Label;
-use Psalm\Node\VirtualNode;
-
-class VirtualLabel extends Label implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php
deleted file mode 100644
index 6836d57..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNamespace.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Namespace_;
-use Psalm\Node\VirtualNode;
-
-class VirtualNamespace extends Namespace_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php
deleted file mode 100644
index 4cd8403..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualNop.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Nop;
-use Psalm\Node\VirtualNode;
-
-/** Nop/empty statement (;). */
-class VirtualNop extends Nop implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php
deleted file mode 100644
index a741d69..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualProperty.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Property;
-use Psalm\Node\VirtualNode;
-
-class VirtualProperty extends Property implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php
deleted file mode 100644
index c96ea93..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualPropertyProperty.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\PropertyProperty;
-use Psalm\Node\VirtualNode;
-
-class VirtualPropertyProperty extends PropertyProperty implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php
deleted file mode 100644
index 5a92614..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualReturn.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Return_;
-use Psalm\Node\VirtualNode;
-
-class VirtualReturn extends Return_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php
deleted file mode 100644
index fa24607..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStatic.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Static_;
-use Psalm\Node\VirtualNode;
-
-class VirtualStatic extends Static_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php
deleted file mode 100644
index 8ed4907..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualStaticVar.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\StaticVar;
-use Psalm\Node\VirtualNode;
-
-class VirtualStaticVar extends StaticVar implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php
deleted file mode 100644
index 7960a0b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualSwitch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Switch_;
-use Psalm\Node\VirtualNode;
-
-class VirtualSwitch extends Switch_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php
deleted file mode 100644
index c8ce55a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualThrow.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Throw_;
-use Psalm\Node\VirtualNode;
-
-class VirtualThrow extends Throw_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php
deleted file mode 100644
index 98dd497..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTrait.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Trait_;
-use Psalm\Node\VirtualNode;
-
-class VirtualTrait extends Trait_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php
deleted file mode 100644
index e13d02a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTraitUse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\TraitUse;
-use Psalm\Node\VirtualNode;
-
-class VirtualTraitUse extends TraitUse implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php
deleted file mode 100644
index 2f8a349..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualTryCatch.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\TryCatch;
-use Psalm\Node\VirtualNode;
-
-class VirtualTryCatch extends TryCatch implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php
deleted file mode 100644
index 686eb44..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUnset.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Unset_;
-use Psalm\Node\VirtualNode;
-
-class VirtualUnset extends Unset_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php
deleted file mode 100644
index 535b3e8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\Use_;
-use Psalm\Node\VirtualNode;
-
-class VirtualUse extends Use_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php
deleted file mode 100644
index 742b91c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualUseUse.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\UseUse;
-use Psalm\Node\VirtualNode;
-
-class VirtualUseUse extends UseUse implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php b/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php
deleted file mode 100644
index fe2cade..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/Stmt/VirtualWhile.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node\Stmt;
-
-use PhpParser\Node\Stmt\While_;
-use Psalm\Node\VirtualNode;
-
-class VirtualWhile extends While_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php
deleted file mode 100644
index 326e70a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualArg.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Arg;
-
-class VirtualArg extends Arg implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php
deleted file mode 100644
index c2e4682..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttribute.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Attribute;
-
-class VirtualAttribute extends Attribute implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php
deleted file mode 100644
index 1b5a882..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualAttributeGroup.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\AttributeGroup;
-
-class VirtualAttributeGroup extends AttributeGroup implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php
deleted file mode 100644
index bb1c33c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualConst.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Const_;
-
-class VirtualConst extends Const_ implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php
deleted file mode 100644
index 4a5b01f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualIdentifier.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Identifier;
-
-/**
- * Represents a non-namespaced name. Namespaced names are represented using Name nodes.
- */
-class VirtualIdentifier extends Identifier implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php
deleted file mode 100644
index d2b499c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualMatchArm.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\MatchArm;
-
-class VirtualMatchArm extends MatchArm implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php
deleted file mode 100644
index 57316bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualName.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Name;
-
-class VirtualName extends Name implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php
deleted file mode 100644
index b37dd76..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualNode.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Node;
-
-/**
- * Describe a Node that is not part of the original AST and was created by Psalm for analysis
- */
-interface VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php
deleted file mode 100644
index d77a1b2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualNullableType.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\NullableType;
-
-class VirtualNullableType extends NullableType implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php
deleted file mode 100644
index f44e7ec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualParam.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\Param;
-
-class VirtualParam extends Param implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php
deleted file mode 100644
index e45bed5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualUnionType.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\UnionType;
-
-class VirtualUnionType extends UnionType implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php b/vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php
deleted file mode 100644
index 03315ec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Node/VirtualVarLikeIdentifier.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Node;
-
-use PhpParser\Node\VarLikeIdentifier;
-
-/**
- * Represents a name that is written in source code with a leading dollar,
- * but is not a proper variable. The leading dollar is not stored as part of the name.
- *
- * Examples: Names in property declarations are formatted as variables. Names in static property
- * lookups are also formatted as variables.
- */
-class VirtualVarLikeIdentifier extends VarLikeIdentifier implements VirtualNode
-{
-
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php b/vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php
deleted file mode 100644
index afd0e15..0000000
--- a/vendor/vimeo/psalm/src/Psalm/NodeTypeProvider.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use PhpParser;
-use Psalm\Type\Union;
-
-interface NodeTypeProvider
-{
- /**
- * @param PhpParser\Node\Expr|PhpParser\Node\Name|PhpParser\Node\Stmt\Return_ $node
- */
- public function setType(PhpParser\NodeAbstract $node, Union $type): void;
-
- /**
- * @param PhpParser\Node\Expr|PhpParser\Node\Name|PhpParser\Node\Stmt\Return_ $node
- */
- public function getType(PhpParser\NodeAbstract $node): ?Union;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php
deleted file mode 100644
index 66909ac..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-
-interface AddTaintsInterface
-{
- /**
- * Called to see what taints should be added
- *
- * @return list<string>
- */
- 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 a0d75fe..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterAnalysisEvent;
-
-interface AfterAnalysisInterface
-{
- /**
- * Called after analysis is complete
- */
- public static function afterAnalysis(AfterAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php
deleted file mode 100644
index 2a94c39..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeAnalysisEvent;
-
-interface AfterClassLikeAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @return null|false
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterStatementAnalysis(AfterClassLikeAnalysisEvent $event);
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php
deleted file mode 100644
index bb0d6b0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeExistenceCheckEvent;
-
-interface AfterClassLikeExistenceCheckInterface
-{
- public static function afterClassLikeExistenceCheck(AfterClassLikeExistenceCheckEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php
deleted file mode 100644
index 5b68be1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterClassLikeVisitEvent;
-
-interface AfterClassLikeVisitInterface
-{
- /**
- * @return void
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterClassLikeVisit(AfterClassLikeVisitEvent $event);
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php
deleted file mode 100644
index 83c525d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterCodebasePopulatedEvent;
-
-interface AfterCodebasePopulatedInterface
-{
- /**
- * Called after codebase has been populated
- *
- * @return void
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterCodebasePopulated(AfterCodebasePopulatedEvent $event);
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php
deleted file mode 100644
index 0f22957..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterEveryFunctionCallAnalysisEvent;
-
-interface AfterEveryFunctionCallAnalysisInterface
-{
- public static function afterEveryFunctionCallAnalysis(AfterEveryFunctionCallAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php
deleted file mode 100644
index 2548301..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterExpressionAnalysisEvent;
-
-interface AfterExpressionAnalysisInterface
-{
- /**
- * Called after an expression has been checked
- *
- * @return null|false
- */
- public static function afterExpressionAnalysis(AfterExpressionAnalysisEvent $event): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php
deleted file mode 100644
index 7df61fd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterFileAnalysisEvent;
-
-interface AfterFileAnalysisInterface
-{
- /**
- * Called after a file has been checked
- */
- public static function afterAnalyzeFile(AfterFileAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php
deleted file mode 100644
index ccf4d2f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterFunctionCallAnalysisEvent;
-
-interface AfterFunctionCallAnalysisInterface
-{
- public static function afterFunctionCallAnalysis(AfterFunctionCallAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php
deleted file mode 100644
index 6db316d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEvent;
-
-interface AfterFunctionLikeAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @return null|false
- */
- public static function afterStatementAnalysis(AfterFunctionLikeAnalysisEvent $event): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php
deleted file mode 100644
index 539b3d7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterMethodCallAnalysisEvent;
-
-interface AfterMethodCallAnalysisInterface
-{
- public static function afterMethodCallAnalysis(AfterMethodCallAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php
deleted file mode 100644
index 449ec5d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AfterStatementAnalysisEvent;
-
-interface AfterStatementAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @return null|false
- */
- public static function afterStatementAnalysis(AfterStatementAnalysisEvent $event): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php
deleted file mode 100644
index e4e72d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\BeforeFileAnalysisEvent;
-
-interface BeforeFileAnalysisInterface
-{
- /**
- * Called before a file has been checked
- */
- public static function beforeAnalyzeFile(BeforeFileAnalysisEvent $event): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php b/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php
deleted file mode 100644
index 5363179..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Expr;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class AddRemoveTaintsEvent
-{
- /**
- * @var Expr
- */
- private $expr;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * Called after an expression has been checked
- */
- public function __construct(
- Expr $expr,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase
- ) {
- $this->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 b90e349..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\SourceControl\SourceControlInfo;
-
-class AfterAnalysisEvent
-{
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var IssueData[][]
- */
- private $issues;
- /**
- * @var array
- */
- private $build_info;
- /**
- * @var SourceControlInfo|null
- */
- private $source_control_info;
-
- /**
- * Called after analysis is complete
- *
- * @param array<string, list<IssueData>> $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 f74e9db..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-
-class AfterClassLikeAnalysisEvent
-{
- /**
- * @var Node\Stmt\ClassLike
- */
- private $stmt;
- /**
- * @var ClassLikeStorage
- */
- private $classlike_storage;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- Node\Stmt\ClassLike $stmt,
- ClassLikeStorage $classlike_storage,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements = []
- ) {
- $this->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 d862014..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-class AfterClassLikeExistenceCheckEvent
-{
- /**
- * @var string
- */
- private $fq_class_name;
- /**
- * @var CodeLocation
- */
- private $code_location;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- string $fq_class_name,
- CodeLocation $code_location,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements = []
- ) {
- $this->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 206b0b4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Stmt\ClassLike;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\FileSource;
-use Psalm\Storage\ClassLikeStorage;
-
-class AfterClassLikeVisitEvent
-{
- /**
- * @var ClassLike
- */
- private $stmt;
- /**
- * @var ClassLikeStorage
- */
- private $storage;
- /**
- * @var FileSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- ClassLike $stmt,
- ClassLikeStorage $storage,
- FileSource $statements_source,
- Codebase $codebase,
- array $file_replacements = []
- ) {
- $this->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 6d2d91a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\Codebase;
-
-class AfterCodebasePopulatedEvent
-{
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * Called after codebase has been populated
- */
- public function __construct(Codebase $codebase)
- {
- $this->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 92d5717..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Expr\FuncCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class AfterEveryFunctionCallAnalysisEvent
-{
- /**
- * @var FuncCall
- */
- private $expr;
- /**
- * @var string
- */
- private $function_id;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
-
- public function __construct(
- FuncCall $expr,
- string $function_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase
- ) {
- $this->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 3f21097..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Expr;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-class AfterExpressionAnalysisEvent
-{
- /**
- * @var Expr
- */
- private $expr;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * Called after an expression has been checked
- *
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- Expr $expr,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements = []
- ) {
- $this->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 65027e6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Stmt;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FileStorage;
-
-class AfterFileAnalysisEvent
-{
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Context
- */
- private $file_context;
- /**
- * @var FileStorage
- */
- private $file_storage;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var Stmt[]
- */
- private $stmts;
-
- /**
- * Called after a file has been checked
- *
- * @param array<Stmt> $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 caa0576..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Expr\FuncCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-class AfterFunctionCallAnalysisEvent
-{
- /**
- * @var FuncCall
- */
- private $expr;
- /**
- * @var non-empty-string
- */
- private $function_id;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var Union
- */
- private $return_type_candidate;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * @param non-empty-string $function_id
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- FuncCall $expr,
- string $function_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- Union $return_type_candidate,
- array $file_replacements
- ) {
- $this->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 df6cbef..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\NodeTypeProvider;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeStorage;
-
-class AfterFunctionLikeAnalysisEvent
-{
- /**
- * @var Node\FunctionLike
- */
- private $stmt;
- /**
- * @var FunctionLikeStorage
- */
- private $functionlike_storage;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
- /**
- * @var NodeTypeProvider
- */
- private $node_type_provider;
- /**
- * @var Context
- */
- private $context;
-
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- Node\FunctionLike $stmt,
- FunctionLikeStorage $functionlike_storage,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements,
- NodeTypeProvider $node_type_provider,
- Context $context
- ) {
- $this->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 ea60ffa..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\MethodCall;
-use PhpParser\Node\Expr\StaticCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-class AfterMethodCallAnalysisEvent
-{
- /**
- * @var MethodCall|StaticCall
- */
- private $expr;
- /**
- * @var string
- */
- private $method_id;
- /**
- * @var string
- */
- private $appearing_method_id;
- /**
- * @var string
- */
- private $declaring_method_id;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
- /**
- * @var Union|null
- */
- private $return_type_candidate;
-
- /**
- * @param MethodCall|StaticCall $expr
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- Expr $expr,
- string $method_id,
- string $appearing_method_id,
- string $declaring_method_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements = [],
- Union $return_type_candidate = null
- ) {
- $this->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 ff3f204..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser\Node\Stmt;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-class AfterStatementAnalysisEvent
-{
- /**
- * @var Stmt
- */
- private $stmt;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Codebase
- */
- private $codebase;
- /**
- * @var FileManipulation[]
- */
- private $file_replacements;
-
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- */
- public function __construct(
- Stmt $stmt,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array $file_replacements = []
- ) {
- $this->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 c11f317..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FileStorage;
-
-class BeforeFileAnalysisEvent
-{
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var Context
- */
- private $file_context;
- /**
- * @var FileStorage
- */
- private $file_storage;
- /**
- * @var Codebase
- */
- private $codebase;
-
- /**
- * Called before a file has been checked
- */
- public function __construct(
- StatementsSource $statements_source,
- Context $file_context,
- FileStorage $file_storage,
- Codebase $codebase
- ) {
- $this->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 48a9ee5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\StatementsSource;
-
-class FunctionExistenceProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var string
- */
- private $function_id;
-
- /**
- * 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 function __construct(
- StatementsSource $statements_source,
- string $function_id
- ) {
- $this->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 a623e69..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class FunctionParamsProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var string
- */
- private $function_id;
- /**
- * @var PhpParser\Node\Arg[]
- */
- private $call_args;
- /**
- * @var Context|null
- */
- private $context;
- /**
- * @var CodeLocation|null
- */
- private $code_location;
-
- /**
- * @param list<PhpParser\Node\Arg> $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 e686faf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class FunctionReturnTypeProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $statements_source;
- /**
- * @var non-empty-string
- */
- private $function_id;
- /**
- * @var PhpParser\Node\Expr\FuncCall
- */
- private $stmt;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var CodeLocation
- */
- private $code_location;
-
- /**
- * 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 non-empty-string $function_id
- */
- public function __construct(
- StatementsSource $statements_source,
- string $function_id,
- PhpParser\Node\Expr\FuncCall $stmt,
- Context $context,
- CodeLocation $code_location
- ) {
- $this->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<PhpParser\Node\Arg>
- */
- 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 3ca5acc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\CodeLocation;
-use Psalm\StatementsSource;
-
-class MethodExistenceProviderEvent
-{
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $method_name_lowercase;
- /**
- * @var StatementsSource|null
- */
- private $source;
- /**
- * @var CodeLocation|null
- */
- private $code_location;
-
- /**
- * 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 function __construct(
- string $fq_classlike_name,
- string $method_name_lowercase,
- ?StatementsSource $source = null,
- ?CodeLocation $code_location = null
- ) {
- $this->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 d974e4f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class MethodParamsProviderEvent
-{
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $method_name_lowercase;
- /**
- * @var list<PhpParser\Node\Arg>|null
- */
- private $call_args;
- /**
- * @var StatementsSource|null
- */
- private $statements_source;
- /**
- * @var Context|null
- */
- private $context;
- /**
- * @var CodeLocation|null
- */
- private $code_location;
-
- /**
- * @param list<PhpParser\Node\Arg> $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<PhpParser\Node\Arg>|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 52ab51e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-class MethodReturnTypeProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $source;
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var lowercase-string
- */
- private $method_name_lowercase;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var CodeLocation
- */
- private $code_location;
- /**
- * @var PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall
- */
- private $stmt;
- /**
- * @var Union[]|null
- */
- private $template_type_parameters;
- /**
- * @var string|null
- */
- private $called_fq_classlike_name;
- /**
- * @var lowercase-string|null
- */
- private $called_method_name_lowercase;
-
- /**
- * 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 PhpParser\Node\Expr\MethodCall|PhpParser\Node\Expr\StaticCall $stmt
- * @param ?array<Union> $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<PhpParser\Node\Arg>
- */
- 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 90ceb7d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class MethodVisibilityProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $source;
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $method_name_lowercase;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var CodeLocation|null
- */
- private $code_location;
-
- public function __construct(
- StatementsSource $source,
- string $fq_classlike_name,
- string $method_name_lowercase,
- Context $context,
- ?CodeLocation $code_location = 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;
- }
-
- 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 5cb98d5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class PropertyExistenceProviderEvent
-{
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $property_name;
- /**
- * @var bool
- */
- private $read_mode;
- /**
- * @var StatementsSource|null
- */
- private $source;
- /**
- * @var Context|null
- */
- private $context;
- /**
- * @var CodeLocation|null
- */
- private $code_location;
-
- /**
- * 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 function __construct(
- string $fq_classlike_name,
- string $property_name,
- bool $read_mode,
- ?StatementsSource $source = null,
- ?Context $context = null,
- ?CodeLocation $code_location = null
- ) {
- $this->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 65e91e2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class PropertyTypeProviderEvent
-{
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $property_name;
- /**
- * @var bool
- */
- private $read_mode;
- /**
- * @var StatementsSource|null
- */
- private $source;
- /**
- * @var Context|null
- */
- private $context;
-
- public function __construct(
- string $fq_classlike_name,
- string $property_name,
- bool $read_mode,
- ?StatementsSource $source = null,
- ?Context $context = null
- ) {
- $this->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 78ef4b5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-class PropertyVisibilityProviderEvent
-{
- /**
- * @var StatementsSource
- */
- private $source;
- /**
- * @var string
- */
- private $fq_classlike_name;
- /**
- * @var string
- */
- private $property_name;
- /**
- * @var bool
- */
- private $read_mode;
- /**
- * @var Context
- */
- private $context;
- /**
- * @var CodeLocation
- */
- private $code_location;
-
- public function __construct(
- StatementsSource $source,
- string $fq_classlike_name,
- string $property_name,
- bool $read_mode,
- Context $context,
- CodeLocation $code_location
- ) {
- $this->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 c92d244..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler\Event;
-
-class StringInterpreterEvent
-{
- /**
- * @var string
- */
- private $value;
-
- /**
- * Called after a statement has been checked
- */
- public function __construct(string $value)
- {
- $this->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 dbe4617..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\FunctionExistenceProviderEvent;
-
-interface FunctionExistenceProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 0c966f1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\FunctionParamsProviderEvent;
-use Psalm\Storage\FunctionLikeParameter;
-
-interface FunctionParamsProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- public static function getFunctionIds(): array;
-
- /**
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 8e10b6d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
-use Psalm\Type\Union;
-
-interface FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 f94638f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\MethodExistenceProviderEvent;
-
-interface MethodExistenceProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 a2d44ed..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\MethodParamsProviderEvent;
-use Psalm\Storage\FunctionLikeParameter;
-
-interface MethodParamsProviderInterface
-{
- /**
- * @return array<string>
- */
- public static function getClassLikeNames(): array;
-
- /**
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 1ce1fa1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEvent;
-use Psalm\Type\Union;
-
-interface MethodReturnTypeProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 65ea917..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\MethodVisibilityProviderEvent;
-
-interface MethodVisibilityProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 b45434d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\PropertyExistenceProviderEvent;
-
-interface PropertyExistenceProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 fd7dee3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\PropertyTypeProviderEvent;
-use Psalm\Type\Union;
-
-interface PropertyTypeProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 7680bd2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\PropertyVisibilityProviderEvent;
-
-interface PropertyVisibilityProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 08868cf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEvent;
-
-interface RemoveTaintsInterface
-{
- /**
- * Called to see what taints should be removed
- *
- * @return list<string>
- */
- 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 6bfd222..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\EventHandler;
-
-use Psalm\Plugin\EventHandler\Event\StringInterpreterEvent;
-use Psalm\Type\Atomic\TLiteralString;
-
-interface StringInterpreterInterface
-{
- /**
- * Called after a statement has been checked
- */
- public static function getTypeFromValue(StringInterpreterEvent $event): ?TLiteralString;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php
deleted file mode 100644
index 2e399d4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterAnalysisInterface.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\SourceControl\SourceControlInfo;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterAnalysisInterface
-{
- /**
- * Called after analysis is complete
- *
- * @param array<string, list<IssueData>> $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 c910400..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeAnalysisInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Storage\ClassLikeStorage;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterClassLikeAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- *
- * @return null|false
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterStatementAnalysis(
- Node\Stmt\ClassLike $stmt,
- ClassLikeStorage $classlike_storage,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- );
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php
deleted file mode 100644
index 91fe3b6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeExistenceCheckInterface.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterClassLikeExistenceCheckInterface
-{
- /**
- * @param FileManipulation[] $file_replacements
- */
- public static function afterClassLikeExistenceCheck(
- string $fq_class_name,
- CodeLocation $code_location,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php
deleted file mode 100644
index 229716a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterClassLikeVisitInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Stmt\ClassLike;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\FileSource;
-use Psalm\Storage\ClassLikeStorage;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterClassLikeVisitInterface
-{
- /**
- * @param FileManipulation[] $file_replacements
- *
- * @return void
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterClassLikeVisit(
- ClassLike $stmt,
- ClassLikeStorage $storage,
- FileSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- );
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php
deleted file mode 100644
index 00b13a6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterCodebasePopulatedInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Codebase;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterCodebasePopulatedInterface
-{
- /**
- * Called after codebase has been populated
- *
- * @return void
- * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint
- */
- public static function afterCodebasePopulated(Codebase $codebase);
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php
deleted file mode 100644
index 5fa1c84..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterEveryFunctionCallAnalysisInterface.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Expr\FuncCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterEveryFunctionCallAnalysisInterface
-{
- public static function afterEveryFunctionCallAnalysis(
- FuncCall $expr,
- string $function_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php
deleted file mode 100644
index 6e9b35e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterExpressionAnalysisInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Expr;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterExpressionAnalysisInterface
-{
- /**
- * Called after an expression has been checked
- *
- * @param FileManipulation[] $file_replacements
- *
- * @return null|false
- */
- public static function afterExpressionAnalysis(
- Expr $expr,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- ): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php
deleted file mode 100644
index 28c3f5d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFileAnalysisInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FileStorage;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterFileAnalysisInterface
-{
- /**
- * Called after a file has been checked
- */
- public static function afterAnalyzeFile(
- StatementsSource $statements_source,
- Context $file_context,
- FileStorage $file_storage,
- Codebase $codebase
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php
deleted file mode 100644
index 363e15d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionCallAnalysisInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Expr\FuncCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterFunctionCallAnalysisInterface
-{
- /**
- * @param non-empty-string $function_id
- * @param FileManipulation[] $file_replacements
- */
- public static function afterFunctionCallAnalysis(
- FuncCall $expr,
- string $function_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- Union $return_type_candidate,
- array &$file_replacements
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php
deleted file mode 100644
index 0d67350..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterFunctionLikeAnalysisInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node;
-use Psalm\Codebase;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeStorage;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterFunctionLikeAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- *
- * @return null|false
- */
- public static function afterStatementAnalysis(
- Node\FunctionLike $stmt,
- FunctionLikeStorage $classlike_storage,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- ): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php
deleted file mode 100644
index d563334..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterMethodCallAnalysisInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\MethodCall;
-use PhpParser\Node\Expr\StaticCall;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterMethodCallAnalysisInterface
-{
- /**
- * @param MethodCall|StaticCall $expr
- * @param FileManipulation[] $file_replacements
- */
- public static function afterMethodCallAnalysis(
- Expr $expr,
- string $method_id,
- string $appearing_method_id,
- string $declaring_method_id,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = [],
- Union &$return_type_candidate = null
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php
deleted file mode 100644
index 11a3679..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/AfterStatementAnalysisInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Stmt;
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\FileManipulation;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface AfterStatementAnalysisInterface
-{
- /**
- * Called after a statement has been checked
- *
- * @param FileManipulation[] $file_replacements
- *
- * @return null|false
- */
- public static function afterStatementAnalysis(
- Stmt $stmt,
- Context $context,
- StatementsSource $statements_source,
- Codebase $codebase,
- array &$file_replacements = []
- ): ?bool;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php
deleted file mode 100644
index c1958bf..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/BeforeFileAnalysisInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Codebase;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FileStorage;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface BeforeFileAnalysisInterface
-{
- /**
- * Called before a file has been checked
- */
- public static function beforeAnalyzeFile(
- StatementsSource $statements_source,
- Context $file_context,
- FileStorage $file_storage,
- Codebase $codebase
- ): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php
deleted file mode 100644
index 2c6523a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionExistenceProviderInterface.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface FunctionExistenceProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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 8b23d82..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionParamsProviderInterface.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeParameter;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface FunctionParamsProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- public static function getFunctionIds(): array;
-
- /**
- * @param list<Arg> $call_args
- *
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 125d779..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/FunctionReturnTypeProviderInterface.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface FunctionReturnTypeProviderInterface
-{
- /**
- * @return array<lowercase-string>
- */
- 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<PhpParser\Node\Arg> $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 2964fe6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodExistenceProviderInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\CodeLocation;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface MethodExistenceProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 680c60a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodParamsProviderInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser\Node\Arg;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Storage\FunctionLikeParameter;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface MethodParamsProviderInterface
-{
- /**
- * @return array<string>
- */
- public static function getClassLikeNames(): array;
-
- /**
- * @param list<Arg> $call_args
- *
- * @return ?array<int, FunctionLikeParameter>
- */
- 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 c39a61c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use PhpParser;
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface MethodReturnTypeProviderInterface
-{
- /**
- * @return array<string>
- */
- 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<PhpParser\Node\Arg> $call_args
- * @param ?array<Union> $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 bf61135..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/MethodVisibilityProviderInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface MethodVisibilityProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 6debbb9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyExistenceProviderInterface.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface PropertyExistenceProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 0e3f18f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyTypeProviderInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Context;
-use Psalm\StatementsSource;
-use Psalm\Type\Union;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface PropertyTypeProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 650b944..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/PropertyVisibilityProviderInterface.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\CodeLocation;
-use Psalm\Context;
-use Psalm\StatementsSource;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface PropertyVisibilityProviderInterface
-{
- /**
- * @return array<string>
- */
- 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 976918e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Hook/StringInterpreterInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Plugin\Hook;
-
-use Psalm\Type\Atomic\TLiteralString;
-
-/** @deprecated going to be removed in Psalm 5 */
-interface StringInterpreterInterface
-{
- /**
- * Called after a statement has been checked
- */
- public static function getTypeFromValue(
- string $value
- ): ?TLiteralString;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php
deleted file mode 100644
index f3377d6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/PluginEntryPointInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Plugin;
-
-use SimpleXMLElement;
-
-interface PluginEntryPointInterface
-{
- public function __invoke(RegistrationInterface $registration, ?SimpleXMLElement $config = null): void;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php b/vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php
deleted file mode 100644
index a316ce0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/RegistrationInterface.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Psalm\Plugin;
-
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Scanner\FileScanner;
-
-interface RegistrationInterface
-{
- public function addStubFile(string $file_name): void;
-
- /**
- * @param class-string $handler
- */
- public function registerHooksFromClass(string $handler): void;
-
- /**
- * @param string $fileExtension e.g. `'html'`
- * @param class-string<FileScanner> $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<FileAnalyzer> $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 51748d5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Plugin/Shepherd.php
+++ /dev/null
@@ -1,223 +0,0 @@
-<?php
-
-namespace Psalm\Plugin;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Plugin\EventHandler\AfterAnalysisInterface;
-use Psalm\Plugin\EventHandler\Event\AfterAnalysisEvent;
-
-use function array_filter;
-use function array_merge;
-use function array_values;
-use function curl_close;
-use function curl_exec;
-use function curl_getinfo;
-use function curl_init;
-use function curl_setopt;
-use function function_exists;
-use function fwrite;
-use function is_array;
-use function json_encode;
-use function parse_url;
-use function str_replace;
-use function strlen;
-use function var_export;
-
-use const CURLINFO_HEADER_OUT;
-use const CURLOPT_HTTPHEADER;
-use const CURLOPT_POST;
-use const CURLOPT_POSTFIELDS;
-use const CURLOPT_RETURNTRANSFER;
-use const PHP_EOL;
-use const PHP_URL_SCHEME;
-use const STDERR;
-
-class Shepherd implements AfterAnalysisInterface
-{
- /**
- * Called after analysis is complete
- */
- public static function afterAnalysis(
- AfterAnalysisEvent $event
- ): void {
- $codebase = $event->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 8d5340c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/PluginRegistrationSocket.php
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use InvalidArgumentException;
-use LogicException;
-use Psalm\Internal\Analyzer\FileAnalyzer;
-use Psalm\Internal\Scanner\FileScanner;
-use Psalm\Plugin\EventHandler\FunctionExistenceProviderInterface;
-use Psalm\Plugin\EventHandler\FunctionParamsProviderInterface;
-use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
-use Psalm\Plugin\EventHandler\MethodExistenceProviderInterface;
-use Psalm\Plugin\EventHandler\MethodParamsProviderInterface;
-use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface;
-use Psalm\Plugin\EventHandler\MethodVisibilityProviderInterface;
-use Psalm\Plugin\EventHandler\PropertyExistenceProviderInterface;
-use Psalm\Plugin\EventHandler\PropertyTypeProviderInterface;
-use Psalm\Plugin\EventHandler\PropertyVisibilityProviderInterface;
-use Psalm\Plugin\Hook\FunctionExistenceProviderInterface as LegacyFunctionExistenceProviderInterface;
-use Psalm\Plugin\Hook\FunctionParamsProviderInterface as LegacyFunctionParamsProviderInterface;
-use Psalm\Plugin\Hook\FunctionReturnTypeProviderInterface as LegacyFunctionReturnTypeProviderInterface;
-use Psalm\Plugin\Hook\MethodExistenceProviderInterface as LegacyMethodExistenceProviderInterface;
-use Psalm\Plugin\Hook\MethodParamsProviderInterface as LegacyMethodParamsProviderInterface;
-use Psalm\Plugin\Hook\MethodReturnTypeProviderInterface as LegacyMethodReturnTypeProviderInterface;
-use Psalm\Plugin\Hook\MethodVisibilityProviderInterface as LegacyMethodVisibilityProviderInterface;
-use Psalm\Plugin\Hook\PropertyExistenceProviderInterface as LegacyPropertyExistenceProviderInterface;
-use Psalm\Plugin\Hook\PropertyTypeProviderInterface as LegacyPropertyTypeProviderInterface;
-use Psalm\Plugin\Hook\PropertyVisibilityProviderInterface as LegacyPropertyVisibilityProviderInterface;
-use Psalm\Plugin\RegistrationInterface;
-
-use function class_exists;
-use function in_array;
-use function is_a;
-use function is_subclass_of;
-use function sprintf;
-
-class PluginRegistrationSocket implements RegistrationInterface
-{
- /** @var Config */
- private $config;
-
- /** @var Codebase */
- private $codebase;
-
- /**
- * @var array<string, class-string<FileScanner>>
- */
- private $additionalFileTypeScanners = [];
-
- /**
- * @var array<string, class-string<FileAnalyzer>>
- */
- private $additionalFileTypeAnalyzers = [];
-
- /**
- * @var list<string>
- */
- 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<FileScanner> $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<string, class-string<FileScanner>>
- * @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<FileAnalyzer> $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<string, class-string<FileAnalyzer>>
- * @deprecated will be removed in v5.0, use \Psalm\PluginFileExtensionsSocket instead (#6788)
- */
- public function getAdditionalFileTypeAnalyzers(): array
- {
- return $this->additionalFileTypeAnalyzers;
- }
-
- /**
- * @return list<string> 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 192976d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Progress/DebugProgress.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Progress;
-
-use function error_reporting;
-
-use const E_ALL;
-
-class DebugProgress extends Progress
-{
- public function setErrorReporting(): void
- {
- error_reporting(E_ALL);
- }
-
- public function debug(string $message): void
- {
- $this->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 76f91e9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Progress/DefaultProgress.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-namespace Psalm\Progress;
-
-use function max;
-use function microtime;
-use function str_repeat;
-use function strlen;
-
-class DefaultProgress extends LongProgress
-{
- private const TOO_MANY_FILES = 1500;
-
- // Update the progress bar at most once per 0.1 seconds.
- // This reduces flickering and reduces the amount of time spent writing to STDERR and updating the terminal.
- private const PROGRESS_BAR_SAMPLE_INTERVAL = 0.1;
-
- /** @var float the last time when the progress bar UI was updated */
- private $previous_update_time = 0.0;
-
- public function taskDone(int $level): void
- {
- if ($this->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 0ff13f1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Progress/LongProgress.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-namespace Psalm\Progress;
-
-use LogicException;
-
-use function floor;
-use function sprintf;
-use function str_repeat;
-use function strlen;
-
-use const PHP_EOL;
-
-class LongProgress extends Progress
-{
- public const NUMBER_OF_COLUMNS = 60;
-
- /** @var int|null */
- protected $number_of_tasks;
-
- /** @var int */
- protected $progress = 0;
-
- /** @var bool */
- protected $print_errors = false;
-
- /** @var bool */
- protected $print_infos = false;
-
- public function __construct(bool $print_errors = true, bool $print_infos = true)
- {
- $this->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 678f4d1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Progress/Progress.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-namespace Psalm\Progress;
-
-use function error_reporting;
-use function function_exists;
-use function fwrite;
-use function sapi_windows_cp_is_utf8;
-use function stripos;
-
-use const E_ERROR;
-use const PHP_OS;
-use const STDERR;
-
-abstract class Progress
-{
- public function setErrorReporting(): void
- {
- error_reporting(E_ERROR);
- }
-
- public function debug(string $message): void
- {
- }
-
- public function startScanningFiles(): void
- {
- }
-
- public function startAnalyzingFiles(): void
- {
- }
-
- public function startAlteringFiles(): void
- {
- }
-
- public function alterFileDone(string $file_name): void
- {
- }
-
- public function start(int $number_of_tasks): void
- {
- }
-
- public function taskDone(int $level): void
- {
- }
-
- public function finish(): void
- {
- }
-
- public function write(string $message): void
- {
- fwrite(STDERR, $message);
- }
-
- protected static function doesTerminalSupportUtf8(): bool
- {
- if (stripos(PHP_OS, 'WIN') === 0) {
- if (!function_exists('sapi_windows_cp_is_utf8') || !sapi_windows_cp_is_utf8()) {
- return false;
- }
- }
-
- return true;
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php b/vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php
deleted file mode 100644
index fb14dcc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Progress/VoidProgress.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Progress;
-
-class VoidProgress extends Progress
-{
- public function write(string $message): void
- {
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Report.php b/vendor/vimeo/psalm/src/Psalm/Report.php
deleted file mode 100644
index 97604a7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report\ReportOptions;
-
-use function array_filter;
-use function htmlspecialchars;
-
-use const ENT_QUOTES;
-use const ENT_XML1;
-
-abstract class Report
-{
- public const TYPE_COMPACT = 'compact';
- public const TYPE_CONSOLE = 'console';
- public const TYPE_PYLINT = 'pylint';
- public const TYPE_JSON = 'json';
- public const TYPE_JSON_SUMMARY = 'json-summary';
- public const TYPE_SONARQUBE = 'sonarqube';
- public const TYPE_EMACS = 'emacs';
- public const TYPE_XML = 'xml';
- public const TYPE_JUNIT = 'junit';
- public const TYPE_CHECKSTYLE = 'checkstyle';
- public const TYPE_TEXT = 'text';
- public const TYPE_GITHUB_ACTIONS = 'github';
- public const TYPE_PHP_STORM = 'phpstorm';
- public const TYPE_SARIF = 'sarif';
- public const TYPE_CODECLIMATE = 'codeclimate';
- public const TYPE_COUNT = 'count';
-
- /**
- * @var array<int, IssueData>
- */
- protected $issues_data;
-
- /** @var array<string, int> */
- 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<int, IssueData> $issues_data
- * @param array<string, int> $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 247c258..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/CheckstyleReport.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Report;
-
-use function sprintf;
-
-class CheckstyleReport extends Report
-{
- public function create(): string
- {
- $output = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
-
- $output .= '<checkstyle>' . "\n";
-
- foreach ($this->issues_data as $issue_data) {
- $message = sprintf(
- '%s: %s',
- $issue_data->type,
- $issue_data->message
- );
-
- $output .= '<file name="' . $this->xmlEncode($issue_data->file_name) . '">' . "\n";
- $output .= ' ';
- $output .= '<error';
- $output .= ' line="' . $issue_data->line_from . '"';
- $output .= ' column="' . $issue_data->column_from . '"';
- $output .= ' severity="' . $issue_data->severity . '"';
- $output .= ' message="' . $this->xmlEncode($message) . '"';
- $output .= '/>' . "\n";
- $output .= '</file>' . "\n";
- }
-
- $output .= '</checkstyle>' . "\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 cdd1458..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/CodeClimateReport.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Internal\Json\Json;
-use Psalm\Report;
-
-use function array_map;
-use function array_values;
-use function md5;
-
-/**
- * CodeClimate format
- * This is the format used by Gitlab for CodeQuality
- *
- * @see https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html
- * @see https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types
- *
- * @author Olivier Doucet <webmaster@ajeux.com>
- */
-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 f1d001a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/CompactReport.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Report;
-use Symfony\Component\Console\Helper\Table;
-use Symfony\Component\Console\Output\BufferedOutput;
-
-use function count;
-use function implode;
-use function str_split;
-use function strlen;
-use function strtoupper;
-
-class CompactReport extends Report
-{
- /**
- * @psalm-suppress PossiblyNullReference
- */
- public function create(): string
- {
- /** @var BufferedOutput|null $buffer */
- $buffer = null;
-
- /** @var Table|null $table */
- $table = null;
-
- /** @var string|null $current_file */
- $current_file = null;
-
- $output = [];
- foreach ($this->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 214b712..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/ConsoleReport.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\DataFlowNodeData;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report;
-
-use function basename;
-use function get_cfg_var;
-use function ini_get;
-use function strlen;
-use function strtr;
-use function substr;
-
-class ConsoleReport extends Report
-{
- /** @var string|null */
- private $link_format;
-
- public function create(): string
- {
- $output = '';
- foreach ($this->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<DataFlowNodeData|array{label: string, entry_path_type: string}> $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 .= ' <no known location>' . "\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 b044d85..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/CountReport.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Report;
-
-use Psalm\Report;
-
-use function array_key_exists;
-use function uksort;
-
-class CountReport extends Report
-{
- public function create(): string
- {
- $issue_type_counts = [];
- foreach ($this->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 785b502..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/EmacsReport.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Report;
-
-use function sprintf;
-
-class EmacsReport extends Report
-{
- public function create(): string
- {
- $output = '';
- foreach ($this->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 9625de5..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/GithubActionsReport.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Report;
-
-use function sprintf;
-use function strtr;
-
-class GithubActionsReport extends Report
-{
- public function create(): string
- {
- $output = '';
- foreach ($this->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 442e464..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/JsonReport.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Internal\Json\Json;
-use Psalm\Report;
-
-use function array_map;
-use function array_values;
-
-class JsonReport extends Report
-{
- public function create(): string
- {
- $options = $this->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 fc36ccd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/JsonSummaryReport.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Internal\Json\Json;
-use Psalm\Report;
-
-class JsonSummaryReport extends Report
-{
- public function create(): string
- {
- $type_counts = [];
-
- foreach ($this->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 6b849dc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/JunitReport.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use DOMDocument;
-use DOMElement;
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report;
-
-use function count;
-use function trim;
-
-/**
- * based on https://github.com/m50/psalm-json-to-junit
- * Copyright (c) Marisa Clardy marisa@clardy.eu
- *
- * with a few modifications
- */
-class JunitReport extends Report
-{
- public function create(): string
- {
- $errors = 0;
- $tests = 0;
-
- $ndata = [];
-
- foreach ($this->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<IssueData>
- * } $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<IssueData> $failures
- *
- * @return array<string, non-empty-list<IssueData>>
- */
- 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 8bb1f68..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/PhpStormReport.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\DataFlowNodeData;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report;
-
-use function substr;
-
-class PhpStormReport extends Report
-{
- public function create(): string
- {
- $output = '';
- foreach ($this->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<DataFlowNodeData|array{label: string, entry_path_type: string}> $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 .= ' <no known location>' . "\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 fd348f0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/PylintReport.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report;
-
-use function sprintf;
-
-class PylintReport extends Report
-{
- public function create(): string
- {
- $output = '';
- foreach ($this->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 3f91435..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/ReportOptions.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Report;
-
-class ReportOptions
-{
- /**
- * @var bool
- */
- public $use_color = true;
-
- /**
- * @var bool
- */
- public $show_snippet = true;
-
- /**
- * @var bool
- */
- public $show_info = true;
-
- /**
- * @var Report::TYPE_*
- */
- public $format = Report::TYPE_CONSOLE;
-
- /**
- * @var bool
- */
- public $pretty = false;
-
- /**
- * @var ?string
- */
- public $output_path;
-
- /**
- * @var bool
- */
- public $show_suggestions = true;
-
- /** @var bool */
- public $in_ci = false;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php b/vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php
deleted file mode 100644
index c489901..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/SarifReport.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Analyzer\DataFlowNodeData;
-use Psalm\Internal\Json\Json;
-use Psalm\Report;
-
-use function file_exists;
-use function file_get_contents;
-use function strpos;
-
-/**
- * SARIF report format suitable for import into any SARIF compatible solution
- *
- * https://docs.oasis-open.org/sarif/sarif/v2.1.0/cs01/sarif-v2.1.0-cs01.html
- */
-class SarifReport extends Report
-{
- public function create(): string
- {
- $report = [
- 'version' => '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 ea6a6d0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/SonarqubeReport.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Internal\Json\Json;
-use Psalm\Report;
-
-use function max;
-
-/**
- * JSON report format suitable for import into SonarQube or SonarCloud as
- * generic (external) issue data via `sonar.externalIssuesReportPaths`.
- *
- * https://docs.sonarqube.org/latest/analysis/generic-issue/
- */
-class SonarqubeReport extends Report
-{
- public function create(): string
- {
- $report = ['issues' => []];
-
- 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 1365ceb..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/TextReport.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use Psalm\Config;
-use Psalm\Report;
-
-use function sprintf;
-
-class TextReport extends Report
-{
- public function create(): string
- {
- $output = '';
- foreach ($this->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 eea9c05..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Report/XmlReport.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Psalm\Report;
-
-use LSS\Array2XML;
-use Psalm\Internal\Analyzer\DataFlowNodeData;
-use Psalm\Internal\Analyzer\IssueData;
-use Psalm\Report;
-
-use function array_map;
-use function get_object_vars;
-
-class XmlReport extends Report
-{
- public function create(): string
- {
- $xml = Array2XML::createXML(
- 'report',
- [
- 'item' => 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 9238c1f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/CommitInfo.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-
-namespace Psalm\SourceControl\Git;
-
-/**
- * Commit info.
- *
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- */
-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 7f89161..0000000
--- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/GitInfo.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace Psalm\SourceControl\Git;
-
-use Psalm\SourceControl\SourceControlInfo;
-
-/**
- * Data represents "git" of Coveralls API.
- *
- * "git": {
- * "head": {
- * "id": "b31f08d07ae564b08237e5a336e478b24ccc4a65",
- * "author_name": "Nick Merwin",
- * "author_email": "...",
- * "committer_name": "Nick Merwin",
- * "committer_email": "...",
- * "message": "version bump"
- * },
- * "branch": "master",
- * "remotes": [
- * {
- * "name": "origin",
- * "url": "git@github.com:lemurheavy/coveralls-ruby.git"
- * }
- * ]
- * }
- *
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- */
-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 dd609c8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/SourceControl/Git/RemoteInfo.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace Psalm\SourceControl\Git;
-
-/**
- * Remote info.
- *
- * @author Kitamura Satoshi <with.no.parachute@gmail.com>
- */
-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 5cf50c8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/SourceControl/SourceControlInfo.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Psalm\SourceControl;
-
-abstract class SourceControlInfo
-{
- abstract public function toArray(): array;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/StatementsSource.php b/vendor/vimeo/psalm/src/Psalm/StatementsSource.php
deleted file mode 100644
index e3086d7..0000000
--- a/vendor/vimeo/psalm/src/Psalm/StatementsSource.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Psalm\Type\Union;
-
-interface StatementsSource extends FileSource
-{
- public function getNamespace(): ?string;
-
- /**
- * @return array<lowercase-string, string>
- */
- public function getAliasedClassesFlipped(): array;
-
- /**
- * @return array<string, string>
- */
- public function getAliasedClassesFlippedReplaceable(): array;
-
- public function getFQCLN(): ?string;
-
- public function getClassName(): ?string;
-
- public function getParentFQCLN(): ?string;
-
- /**
- * @return array<string, array<string, Union>>|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<string>
- */
- public function getSuppressedIssues(): array;
-
- /**
- * @param list<string> $new_issues
- */
- public function addSuppressedIssues(array $new_issues): void;
-
- /**
- * @param list<string> $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 53f13b1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/Assertion.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateBound;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Type\Atomic\TTemplateParam;
-
-use function array_map;
-use function implode;
-use function is_string;
-use function str_replace;
-
-class Assertion
-{
- /**
- * @var array<int, array<int, string>> 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<int, array<int, string>> $rule
- */
- public function __construct($var_id, array $rule)
- {
- $this->rule = $rule;
- $this->var_id = $var_id;
- }
-
- /**
- * @param array<string, array<string, non-empty-list<TemplateBound>>> $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<int, string> $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 c51fa72..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeArg.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use Psalm\Type\Union;
-
-class AttributeArg
-{
- /**
- * @var ?string
- * @psalm-suppress PossiblyUnusedProperty It's part of the public API for now
- */
- public $name;
-
- /**
- * @var Union|UnresolvedConstantComponent
- */
- public $type;
-
- /**
- * @var CodeLocation
- * @psalm-suppress PossiblyUnusedProperty It's part of the public API for now
- */
- public $location;
-
- /**
- * @param Union|UnresolvedConstantComponent $type
- */
- public function __construct(
- ?string $name,
- $type,
- CodeLocation $location
- ) {
- $this->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 7717966..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/AttributeStorage.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-
-class AttributeStorage
-{
- /**
- * @var string
- */
- public $fq_class_name;
-
- /**
- * @var list<AttributeArg>
- */
- 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<AttributeArg> $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 bcbe39d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/ClassConstantStorage.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use Psalm\Type\Union;
-
-class ClassConstantStorage
-{
- /**
- * @var ?Union
- */
- public $type;
-
- /**
- * @var ClassLikeAnalyzer::VISIBILITY_*
- */
- public $visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC;
-
- /**
- * @var ?CodeLocation
- */
- public $location;
-
- /**
- * @var ?CodeLocation
- */
- public $stmt_location;
-
- /**
- * @var ?UnresolvedConstantComponent
- */
- public $unresolved_node;
-
- /**
- * @var bool
- */
- public $deprecated = false;
-
- /**
- * @var list<AttributeStorage>
- * @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 a5252d8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/ClassLikeStorage.php
+++ /dev/null
@@ -1,491 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\Aliases;
-use Psalm\CodeLocation;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\TypeAlias\ClassTypeAlias;
-use Psalm\Issue\CodeIssue;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-
-use function array_values;
-
-class ClassLikeStorage implements HasAttributesInterface
-{
- use CustomMetadataTrait;
-
- /**
- * @var array<string, ClassConstantStorage>
- */
- 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<non-empty-string>
- */
- public $internal = [];
-
- /**
- * @var TTemplateParam[]
- */
- public $templatedMixins = [];
-
- /**
- * @var list<TNamedObject>
- */
- 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<int, string>
- */
- 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<lowercase-string, string>
- */
- public $direct_class_interfaces = [];
-
- /**
- * Interfaces this class implements explicitly and implicitly
- *
- * @var array<lowercase-string, string>
- */
- public $class_implements = [];
-
- /**
- * Parent interfaces listed explicitly
- *
- * @var array<lowercase-string, string>
- */
- public $direct_interface_parents = [];
-
- /**
- * Parent interfaces
- *
- * @var array<lowercase-string, string>
- */
- public $parent_interfaces = [];
-
- /**
- * There can only be one direct parent class
- *
- * @var ?string
- */
- public $parent_class;
-
- /**
- * Parent classes
- *
- * @var array<lowercase-string, string>
- */
- 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<lowercase-string, string>
- */
- public $used_traits = [];
-
- /**
- * @var array<lowercase-string, lowercase-string>
- */
- public $trait_alias_map = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- public $trait_final_map = [];
-
- /**
- * @var array<string, int>
- */
- 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<lowercase-string, MethodStorage>
- */
- public $methods = [];
-
- /**
- * @var array<lowercase-string, MethodStorage>
- */
- public $pseudo_methods = [];
-
- /**
- * @var array<lowercase-string, MethodStorage>
- */
- 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<lowercase-string, MethodIdentifier>
- */
- public $declaring_pseudo_method_ids = [];
-
- /**
- * @var array<lowercase-string, MethodIdentifier>
- */
- public $declaring_method_ids = [];
-
- /**
- * @var array<lowercase-string, MethodIdentifier>
- */
- 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<lowercase-string, array<string, MethodIdentifier>>
- */
- public $overridden_method_ids = [];
-
- /**
- * @var array<lowercase-string, MethodIdentifier>
- */
- public $documenting_method_ids = [];
-
- /**
- * @var array<lowercase-string, MethodIdentifier>
- */
- public $inheritable_method_ids = [];
-
- /**
- * @var array<lowercase-string, array<string, bool>>
- */
- public $potential_declaring_method_ids = [];
-
- /**
- * @var array<string, PropertyStorage>
- */
- public $properties = [];
-
- /**
- * @var array<string, Union>
- */
- public $pseudo_property_set_types = [];
-
- /**
- * @var array<string, Union>
- */
- public $pseudo_property_get_types = [];
-
- /**
- * @var array<string, string>
- */
- public $declaring_property_ids = [];
-
- /**
- * @var array<string, string>
- */
- public $appearing_property_ids = [];
-
- /**
- * @var array<string, string>
- */
- public $inheritable_property_ids = [];
-
- /**
- * @var array<string, array<string>>
- */
- 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<string, non-empty-array<string, Union>>|null
- */
- public $template_types;
-
- /**
- * @var array<int, bool>|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<string, non-empty-array<int, Union>>|null
- */
- public $template_extended_offsets;
-
- /**
- * A map of which generic classlikes are extended or implemented by this class or interface.
- *
- * The annotation "@extends Traversable<SomeClass, SomeOtherClass>" would generate an entry of
- *
- * [
- * "Traversable" => [
- * "TKey" => new Union([new TNamedObject("SomeClass")]),
- * "TValue" => new Union([new TNamedObject("SomeOtherClass")])
- * ]
- * ]
- *
- * @var array<string, array<string, Union>>|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<string, int>|null
- */
- public $template_type_implements_count;
-
- /**
- * @var ?Union
- */
- public $yield;
-
- /**
- * @var array<string, int>|null
- */
- public $template_type_uses_count;
-
- /**
- * @var array<string, bool>
- */
- public $initialized_properties = [];
-
- /**
- * @var array<string>
- */
- public $invalid_dependencies = [];
-
- /**
- * @var array<lowercase-string, bool>
- */
- 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<CodeIssue>
- */
- public $docblock_issues = [];
-
- /**
- * @var array<string, ClassTypeAlias>
- */
- 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<int, string>
- */
- public $implementation_requirements = [];
-
- /**
- * @var list<AttributeStorage>
- */
- public $attributes = [];
-
- /**
- * @var array<string, EnumCaseStorage>
- */
- public $enum_cases = [];
-
- /**
- * @var 'int'|'string'|null
- */
- public $enum_type;
-
- /**
- * @var ?string
- */
- public $description;
-
- public function __construct(string $name)
- {
- $this->name = $name;
- }
-
- /**
- * @return list<AttributeStorage>
- */
- public function getAttributeStorages(): array
- {
- return $this->attributes;
- }
-
- /**
- * Get the template constraint types for the class.
- *
- * @return list<Union>
- */
- 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 85a8610..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/CustomMetadataTrait.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-/**
- * @psalm-type _MetadataEntry scalar|scalar[]|scalar[][]|scalar[][][]|scalar[][][][]|scalar[][][][][]
- */
-trait CustomMetadataTrait
-{
- /** @var array<string,_MetadataEntry> */
- 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 c61fcea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/EnumCaseStorage.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-
-class EnumCaseStorage
-{
- /**
- * @var int|string|null
- */
- public $value;
-
- /** @var CodeLocation */
- public $stmt_location;
-
- /**
- * @var bool
- */
- public $deprecated = false;
-
- /**
- * @param int|string|null $value
- */
- public function __construct(
- $value,
- CodeLocation $location
- ) {
- $this->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 df09117..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/FileStorage.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\Aliases;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Issue\CodeIssue;
-use Psalm\Type\Union;
-
-class FileStorage
-{
- use CustomMetadataTrait;
-
- /**
- * @var array<lowercase-string, string>
- */
- public $classlikes_in_file = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $referenced_classlikes = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $required_classes = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- public $required_interfaces = [];
-
- /** @var string */
- public $file_path;
-
- /**
- * @var array<string, FunctionStorage>
- */
- public $functions = [];
-
- /** @var array<string, string> */
- public $declaring_function_ids = [];
-
- /**
- * @var array<string, Union>
- */
- public $constants = [];
-
- /** @var array<string, string> */
- public $declaring_constants = [];
-
- /** @var array<lowercase-string, string> */
- public $required_file_paths = [];
-
- /** @var array<lowercase-string, string> */
- 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<CodeIssue>
- */
- public $docblock_issues = [];
-
- /**
- * @var array<string, TypeAlias>
- */
- public $type_aliases = [];
-
- /**
- * @var array<lowercase-string, string>
- */
- 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 70147e8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeParameter.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Scanner\UnresolvedConstantComponent;
-use Psalm\Type\Union;
-
-class FunctionLikeParameter implements HasAttributesInterface
-{
- use CustomMetadataTrait;
-
- /**
- * @var string
- */
- public $name;
-
- /**
- * @var bool
- */
- public $by_ref;
-
- /**
- * @var Union|null
- */
- public $type;
-
- /**
- * @var Union|null
- */
- public $out_type;
-
- /**
- * @var Union|null
- */
- public $signature_type;
-
- /**
- * @var bool
- */
- public $has_docblock_type = false;
-
- /**
- * @var bool
- */
- public $is_optional;
-
- /**
- * @var bool
- */
- public $is_nullable;
-
- /**
- * @var Union|UnresolvedConstantComponent|null
- */
- public $default_type;
-
- /**
- * @var CodeLocation|null
- */
- public $location;
-
- /**
- * @var CodeLocation|null
- */
- public $type_location;
-
- /**
- * @var CodeLocation|null
- */
- public $signature_type_location;
-
- /**
- * @var bool
- */
- public $is_variadic;
-
- /**
- * @var array<string>|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<AttributeStorage>
- */
- 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<AttributeStorage>
- */
- 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 fe23ea0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionLikeStorage.php
+++ /dev/null
@@ -1,304 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Issue\CodeIssue;
-use Psalm\Type\Union;
-
-use function array_column;
-use function array_fill_keys;
-use function array_map;
-use function implode;
-
-abstract class FunctionLikeStorage implements HasAttributesInterface
-{
- use CustomMetadataTrait;
-
- /**
- * @var CodeLocation|null
- */
- public $location;
-
- /**
- * @var CodeLocation|null
- */
- public $stmt_location;
-
- /**
- * @psalm-readonly-allow-private-mutation
- * @var list<FunctionLikeParameter>
- */
- public $params = [];
-
- /**
- * @psalm-readonly-allow-private-mutation
- * @var array<string, bool>
- */
- 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<int, string>
- */
- public $suppressed_issues = [];
-
- /**
- * @var ?bool
- */
- public $deprecated;
-
- /**
- * @var list<non-empty-string>
- */
- public $internal = [];
-
- /**
- * @var bool
- */
- public $variadic = false;
-
- /**
- * @var bool
- */
- public $returns_by_ref = false;
-
- /**
- * @var ?int
- */
- public $required_param_count;
-
- /**
- * @var array<string, Union>
- */
- public $defined_constants = [];
-
- /**
- * @var array<string, bool>
- */
- public $global_variables = [];
-
- /**
- * @var array<string, Union>
- */
- 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<string, non-empty-array<string, Union>>|null
- */
- public $template_types;
-
- /**
- * @var array<int, Assertion>
- */
- public $assertions = [];
-
- /**
- * @var array<int, Assertion>
- */
- public $if_true_assertions = [];
-
- /**
- * @var array<int, Assertion>
- */
- public $if_false_assertions = [];
-
- /**
- * @var bool
- */
- public $has_visitor_issues = false;
-
- /**
- * @var list<CodeIssue>
- */
- public $docblock_issues = [];
-
- /**
- * @var array<string, bool>
- */
- public $throws = [];
-
- /**
- * @var array<string, CodeLocation>
- */
- public $throw_locations = [];
-
- /**
- * @var bool
- */
- public $has_yield = false;
-
- /**
- * @var bool
- */
- public $mutation_free = false;
-
- /**
- * @var string|null
- */
- public $return_type_description;
-
- /**
- * @var array<string, CodeLocation>|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<string>
- */
- public $taint_source_types = [];
-
- /**
- * @var array<string>
- */
- public $added_taints = [];
-
- /**
- * @var array<string>
- */
- public $removed_taints = [];
-
- /**
- * @var array<Union>
- */
- public $conditionally_removed_taints = [];
-
- /**
- * @var array<int, string>
- */
- public $return_source_params = [];
-
- /**
- * @var bool
- */
- public $allow_named_arg_calls = true;
-
- /**
- * @var list<AttributeStorage>
- */
- public $attributes = [];
-
- /**
- * @var list<array{fqn: string, params: array<int>, 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<FunctionLikeParameter> $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<AttributeStorage>
- */
- 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 22be01b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/FunctionStorage.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-class FunctionStorage extends FunctionLikeStorage
-{
- /** @var array<string, bool> */
- 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 c8bca41..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/HasAttributesInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Psalm\Storage;
-
-interface HasAttributesInterface
-{
- /**
- * Returns a list of AttributeStorages with the same order they appear in the AttributeGroups they come from.
- *
- * @return list<AttributeStorage>
- *
- * @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 f9ae6a2..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/MethodStorage.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\Type\Union;
-
-class MethodStorage extends FunctionLikeStorage
-{
- /**
- * @var bool
- */
- public $is_static = false;
-
- /**
- * @var int
- */
- public $visibility = 0;
-
- /**
- * @var bool
- */
- public $final = false;
-
- /**
- * @var bool
- */
- public $final_from_docblock = false;
-
- /**
- * @var bool
- */
- public $abstract = false;
-
- /**
- * @var bool
- */
- public $overridden_downstream = false;
-
- /**
- * @var bool
- */
- public $overridden_somewhere = false;
-
- /**
- * @var bool
- */
- public $inheritdoc = false;
-
- /**
- * @var ?bool
- */
- public $inherited_return_type = false;
-
- /**
- * @var ?string
- */
- public $defining_fqcln;
-
- /**
- * @var bool
- */
- public $has_docblock_param_types = false;
-
- /**
- * @var bool
- */
- public $has_docblock_return_type = false;
-
- /**
- * @var bool
- */
- public $external_mutation_free = false;
-
- /**
- * @var bool
- */
- public $immutable = false;
-
- /**
- * @var bool
- */
- public $mutation_free_inferred = false;
-
- /**
- * @var ?array<string, bool>
- */
- 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 b309a7f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Storage/PropertyStorage.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-namespace Psalm\Storage;
-
-use Psalm\CodeLocation;
-use Psalm\Internal\Analyzer\ClassLikeAnalyzer;
-use Psalm\Type\Union;
-
-class PropertyStorage implements HasAttributesInterface
-{
- use CustomMetadataTrait;
-
- /**
- * @var ?bool
- */
- public $is_static;
-
- /**
- * @var ClassLikeAnalyzer::VISIBILITY_*
- */
- public $visibility = ClassLikeAnalyzer::VISIBILITY_PUBLIC;
-
- /**
- * @var CodeLocation|null
- */
- public $location;
-
- /**
- * @var CodeLocation|null
- */
- public $stmt_location;
-
- /**
- * @var CodeLocation|null
- */
- public $type_location;
-
- /**
- * @var CodeLocation|null
- */
- public $signature_type_location;
-
- /**
- * @var Union|null
- */
- public $type;
-
- /**
- * @var Union|null
- */
- public $signature_type;
-
- /**
- * @var Union|null
- */
- public $suggested_type;
-
- /**
- * @var bool
- */
- public $has_default = false;
-
- /**
- * @var bool
- */
- public $deprecated = false;
-
- /**
- * @var bool
- */
- public $readonly = false;
-
- /**
- * Whether or not to allow mutation by internal methods
- *
- * @var bool
- */
- public $allow_private_mutation = false;
-
- /**
- * @var list<non-empty-string>
- */
- public $internal = [];
-
- /**
- * @var ?string
- */
- public $getter_method;
-
- /**
- * @var bool
- */
- public $is_promoted = false;
-
- /**
- * @var list<AttributeStorage>
- */
- public $attributes = [];
-
- /**
- * @var array<int, string>
- */
- 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<AttributeStorage>
- */
- 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 35ca811..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type.php
+++ /dev/null
@@ -1,761 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use InvalidArgumentException;
-use LogicException;
-use Psalm\Config;
-use Psalm\Internal\Type\Comparator\AtomicTypeComparator;
-use Psalm\Internal\Type\Comparator\UnionTypeComparator;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Internal\Type\TypeParser;
-use Psalm\Internal\Type\TypeTokenizer;
-use Psalm\Plugin\EventHandler\Event\StringInterpreterEvent;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TSingleLetter;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Atomic\TVoid;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_pop;
-use function array_shift;
-use function array_values;
-use function explode;
-use function get_class;
-use function implode;
-use function preg_quote;
-use function preg_replace;
-use function stripos;
-use function strlen;
-use function strpos;
-use function strtolower;
-use function substr;
-
-abstract class Type
-{
- /**
- * Parses a string type representation
- *
- * @param array{int,int}|null $php_version
- * @param array<string, array<string, Union>> $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<lowercase-string, string> $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> $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 47d8e57..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic.php
+++ /dev/null
@@ -1,812 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-use Psalm\Codebase;
-use Psalm\Exception\TypeParseTreeException;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TypeAlias;
-use Psalm\Internal\Type\TypeAlias\LinkableTypeAlias;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TAssertionFalsy;
-use Psalm\Type\Atomic\TBool;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TCallableArray;
-use Psalm\Type\Atomic\TCallableKeyedArray;
-use Psalm\Type\Atomic\TCallableList;
-use Psalm\Type\Atomic\TCallableObject;
-use Psalm\Type\Atomic\TCallableString;
-use Psalm\Type\Atomic\TClassConstant;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TClosedResource;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TDependentGetClass;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TEmptyNumeric;
-use Psalm\Type\Atomic\TEmptyScalar;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\THtmlEscapedString;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralClassString;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNever;
-use Psalm\Type\Atomic\TNonEmptyArray;
-use Psalm\Type\Atomic\TNonEmptyList;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonEmptyMixed;
-use Psalm\Type\Atomic\TNonEmptyNonspecificLiteralString;
-use Psalm\Type\Atomic\TNonEmptyScalar;
-use Psalm\Type\Atomic\TNonEmptyString;
-use Psalm\Type\Atomic\TNonFalsyString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TNumeric;
-use Psalm\Type\Atomic\TNumericString;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TObjectWithProperties;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TResource;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTraitString;
-use Psalm\Type\Atomic\TTrue;
-use Psalm\Type\Atomic\TTypeAlias;
-use Psalm\Type\Atomic\TVoid;
-
-use function array_filter;
-use function array_keys;
-use function get_class;
-use function is_numeric;
-use function strpos;
-use function strtolower;
-
-abstract class Atomic implements TypeNode
-{
- public const KEY = 'atomic';
-
- /**
- * Whether or not the type has been checked yet
- *
- * @var bool
- */
- public $checked = false;
-
- /**
- * Whether or not the type comes from a docblock
- *
- * @var bool
- */
- public $from_docblock = false;
-
- /**
- * @var ?int
- */
- public $offset_start;
-
- /**
- * @var ?int
- */
- public $offset_end;
-
- /**
- * @var ?string
- */
- public $text;
-
- /**
- * @param array{int,int}|null $php_version contains php version when the type comes from signature
- * @param array<string, array<string, Union>> $template_type_map
- * @param array<string, TypeAlias> $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<lowercase-string, string> $aliased_classes
- */
- public function toNamespacedString(
- ?string $namespace,
- array $aliased_classes,
- ?string $this_class,
- bool $use_phpdoc_format
- ): string {
- return $this->getKey();
- }
-
- /**
- * @param array<lowercase-string, string> $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<empty, empty>') {
- 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 cd0c026..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/CallableTrait.php
+++ /dev/null
@@ -1,300 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Storage\FunctionLikeParameter;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-
-use function array_map;
-use function count;
-use function implode;
-
-trait CallableTrait
-{
- /**
- * @var list<FunctionLikeParameter>|null
- */
- public $params = [];
-
- /**
- * @var Union|null
- */
- public $return_type;
-
- /**
- * @var ?bool
- */
- public $is_pure;
-
- /**
- * Constructs a new instance of a generic type
- *
- * @param list<FunctionLikeParameter> $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<lowercase-string, string> $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<lowercase-string, string> $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<TypeNode>
- */
- 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 4ebefe0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/DependentType.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-interface DependentType
-{
- public function getVarId(): string;
-
- /**
- * This returns a replacement type for when the dependent data is invalidated
- */
- public function getReplacement(): Atomic;
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php
deleted file mode 100644
index cbeb416..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/GenericTrait.php
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\TypeNode;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function array_map;
-use function array_values;
-use function count;
-use function implode;
-use function strpos;
-use function substr;
-
-trait GenericTrait
-{
- public function __toString(): string
- {
- $s = '';
- foreach ($this->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<lowercase-string, string> $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<TypeNode>
- */
- 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 4174319..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/HasIntersectionTrait.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type\Atomic;
-
-use function array_map;
-use function implode;
-
-trait HasIntersectionTrait
-{
- /**
- * @var array<string, TNamedObject|TTemplateParam|TIterable|TObjectWithProperties>|null
- */
- public $extra_types;
-
- /**
- * @param array<lowercase-string, string> $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<string, TNamedObject|TTemplateParam|TIterable|TObjectWithProperties>|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 f37518c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/Scalar.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-abstract class Scalar extends Atomic
-{
- public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool
- {
- return true;
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php
deleted file mode 100644
index 1d8583e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAnonymousClassInstance.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an anonymous class (i.e. `new class{}`) with potential methods
- */
-class TAnonymousClassInstance extends TNamedObject
-{
- /**
- * @var string|null
- */
- public $extends;
-
- /**
- * @param string $value the name of the object
- */
- public function __construct(string $value, bool $was_static = false, ?string $extends = null)
- {
- parent::__construct($value, $was_static);
-
- $this->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<lowercase-string, string> $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 05e31a4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArray.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function count;
-use function get_class;
-
-/**
- * Denotes a simple array of the form `array<TKey, TValue>`. 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<lowercase-string, string> $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 038b85c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TArrayKey.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `array-key` type, used for something that could be the offset of an `array`.
- */
-class TArrayKey extends Scalar
-{
- public function __toString(): string
- {
- return 'array-key';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'array-key';
- }
-
- /**
- * @param array<lowercase-string, string> $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<lowercase-string, string> $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 db43e12..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TAssertionFalsy.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Represents any value reduced to false when computed in boolean context. This is used for assertions
- */
-class TAssertionFalsy extends Atomic
-{
- public function __toString(): string
- {
- return 'falsy';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'falsy';
- }
-
- public function getAssertionString(bool $exact = false): string
- {
- return 'falsy';
- }
-
- /**
- * @param array<lowercase-string, string> $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 adae27f..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TBool.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `bool` type where the exact value is unknown.
- */
-class TBool extends Scalar
-{
- public function __toString(): string
- {
- return 'bool';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'bool';
- }
-
- /**
- * @param array<lowercase-string, string> $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 fb92d7e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallable.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `callable` type. Can result from an `is_callable` check.
- */
-class TCallable extends Atomic
-{
- use CallableTrait;
-
- /**
- * @var string
- */
- public $value;
-
- /**
- * @param array<lowercase-string, string> $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 1ccce11..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableArray.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an array that is _also_ `callable`.
- */
-class TCallableArray extends TNonEmptyArray
-{
- /**
- * @var string
- */
- public $value = 'callable-array';
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php
deleted file mode 100644
index 0e6175b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableKeyedArray.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an object-like array that is _also_ `callable`.
- */
-class TCallableKeyedArray extends TKeyedArray
-{
- public const KEY = 'callable-array';
-
- public function getKey(bool $include_extra = true): string
- {
- return 'array';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php
deleted file mode 100644
index 237e70c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableList.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a list that is _also_ `callable`.
- */
-class TCallableList extends TNonEmptyList
-{
- public const KEY = 'callable-list';
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php
deleted file mode 100644
index 3ba0a8a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableObject.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an object that is also `callable` (i.e. it has `__invoke` defined).
- */
-class TCallableObject extends TObject
-{
- public function __toString(): string
- {
- return 'callable-object';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'callable-object';
- }
-
- /**
- * @param array<lowercase-string, string> $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 803120d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TCallableString.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `callable-string` type, used to represent an unknown string that is also `callable`.
- */
-class TCallableString extends TNonEmptyString
-{
-
- public function getKey(bool $include_extra = true): string
- {
- return 'callable-string';
- }
-
- public function getId(bool $nested = false): string
- {
- return $this->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 7790806..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassConstant.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type;
-use Psalm\Type\Atomic;
-
-/**
- * Denotes a class constant whose value might not yet be known.
- */
-class TClassConstant extends Atomic
-{
- /** @var string */
- public $fq_classlike_name;
-
- /** @var string */
- public $const_name;
-
- public function __construct(string $fq_classlike_name, string $const_name)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 745778c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassString.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function array_values;
-use function count;
-use function preg_quote;
-use function preg_replace;
-use function stripos;
-use function strpos;
-use function strtolower;
-
-/**
- * Denotes the `class-string` type, used to describe a string representing a valid PHP class.
- * The parent type from which the classes descend may or may not be specified in the constructor.
- */
-class TClassString extends TString
-{
- /**
- * @var string
- */
- public $as;
-
- /**
- * @var ?TNamedObject
- */
- public $as_type;
-
- public function __construct(string $as = 'object', ?TNamedObject $as_type = null)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 edef7ee..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClassStringMap.php
+++ /dev/null
@@ -1,251 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TGenericObject;
-use Psalm\Type\Atomic\TIterable;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Union;
-
-use function get_class;
-
-/**
- * Represents an array where the type of each value
- * is a function of its string key value
- */
-class TClassStringMap extends Atomic
-{
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var ?TNamedObject
- */
- public $as_type;
-
- /**
- * @var Union
- */
- public $value_param;
-
- public const KEY = 'class-string-map';
-
- /**
- * Constructs a new instance of a list
- */
- public function __construct(string $param_name, ?TNamedObject $as_type, Union $value_param)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 c8391b4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosedResource.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `resource` type that has been closed (e.g. a file handle through `fclose()`).
- */
-class TClosedResource extends Atomic
-{
- public function __toString(): string
- {
- return 'closed-resource';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'closed-resource';
- }
-
- public function getId(bool $nested = false): string
- {
- return 'closed-resource';
- }
-
- /**
- * @param array<lowercase-string, string> $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 5e3a9df..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TClosure.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Represents a closure where we know the return type and params
- */
-class TClosure extends TNamedObject
-{
- use CallableTrait;
-
- /** @var array<string, bool> */
- 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 2c12fea..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TConditional.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-/**
- * Internal representation of a conditional return type in phpdoc. For example ($param1 is int ? int : string)
- */
-class TConditional extends Atomic
-{
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var string
- */
- public $defining_class;
-
- /**
- * @var Union
- */
- public $as_type;
-
- /**
- * @var Union
- */
- public $conditional_type;
-
- /**
- * @var Union
- */
- public $if_type;
-
- /**
- * @var Union
- */
- public $else_type;
-
- public function __construct(
- string $param_name,
- string $defining_class,
- Union $as_type,
- Union $conditional_type,
- Union $if_type,
- Union $else_type
- ) {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 d53e53b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetClass.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-/**
- * Represents a string whose value is a fully-qualified class found by get_class($var)
- */
-class TDependentGetClass extends TString implements DependentType
-{
- /**
- * Used to hold information as to what this refers to
- *
- * @var string
- */
- public $typeof;
-
- /**
- * @var Union
- */
- public $as_type;
-
- /**
- * @param string $typeof the variable id
- */
- public function __construct(string $typeof, Union $as_type)
- {
- $this->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 1ca5552..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetDebugType.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Represents a string whose value is that of a type found by get_debug_type($var)
- */
-class TDependentGetDebugType extends TString implements DependentType
-{
- /**
- * Used to hold information as to what this refers to
- *
- * @var string
- */
- public $typeof;
-
- /**
- * @param string $typeof the variable id
- */
- public function __construct(string $typeof)
- {
- $this->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 1c06fcd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentGetType.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Represents a string whose value is that of a type found by gettype($var)
- */
-class TDependentGetType extends TString
-{
- /**
- * Used to hold information as to what this refers to
- *
- * @var string
- */
- public $typeof;
-
- /**
- * @param string $typeof the variable id
- */
- public function __construct(string $typeof)
- {
- $this->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 c5bbd99..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TDependentListKey.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Represents a list key created from foreach ($list as $key => $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 2cfa456..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmpty.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `empty` type, used to describe a type corresponding to no value whatsoever.
- * Empty arrays `[]` have the type `array<empty, empty>`.
- * @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<lowercase-string, string> $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 b5f5222..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyMixed.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `mixed` type, but empty.
- * Generated for `$x` inside the `if` statement `if (!$x) {...}` when `$x` is `mixed` outside.
- */
-class TEmptyMixed extends TMixed
-{
- public function getId(bool $nested = false): string
- {
- return 'empty-mixed';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php
deleted file mode 100644
index 3c970ec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyNumeric.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `numeric` type that's also empty (which can also result from an `is_numeric` and `empty` check).
- */
-class TEmptyNumeric extends TNumeric
-{
- public function getId(bool $nested = false): string
- {
- return 'empty-numeric';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php
deleted file mode 100644
index 21f014b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEmptyScalar.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a `scalar` type that is also empty.
- */
-class TEmptyScalar extends TScalar
-{
- public function getId(bool $nested = false): string
- {
- return 'empty-scalar';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php
deleted file mode 100644
index a624230..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TEnumCase.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an enum with a specific value
- */
-class TEnumCase extends TNamedObject
-{
- /**
- * @var string
- */
- public $case_name;
-
- public function __construct(string $fq_enum_name, string $case_name)
- {
- parent::__construct($fq_enum_name);
-
- $this->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<lowercase-string, string> $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 b97abb6..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFalse.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `false` value type
- */
-class TFalse extends TBool
-{
- /** @var false */
- public $value = false;
-
- public function __toString(): string
- {
- return 'false';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return '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/TFloat.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php
deleted file mode 100644
index 76a7666..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TFloat.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `float` type, where the exact value is unknown.
- */
-class TFloat extends Scalar
-{
- public function __toString(): string
- {
- return 'float';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'float';
- }
-
- /**
- * @param array<lowercase-string, string> $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 e0f7743..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TGenericObject.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function implode;
-use function strrpos;
-use function substr;
-
-/**
- * Denotes an object type that has generic parameters e.g. `ArrayObject<string, Foo\Bar>`
- */
-class TGenericObject extends TNamedObject
-{
- use GenericTrait;
-
- /**
- * @var non-empty-list<Union>
- */
- 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<Union> $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<lowercase-string, string> $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 da315ec..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/THtmlEscapedString.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Special type, specifically for consumption by plugins.
- * @deprecated going to be removed in Psalm 5. Use taints instead.
- */
-class THtmlEscapedString extends TString
-{
- public function getKey(bool $include_extra = true): string
- {
- return 'html-escaped-string';
- }
-
- public function getId(bool $nested = false): string
- {
- return $this->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 27191b8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TInt.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `int` type, where the exact value is unknown.
- */
-class TInt extends Scalar
-{
- public function __toString(): string
- {
- return 'int';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'int';
- }
-
- /**
- * @param array<lowercase-string, string> $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 cf6cd4c..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMask.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use function substr;
-
-/**
- * Represents the type that is the result of a bitmask combination of its parameters.
- * `int-mask<1, 2, 4>` corresponds to `0|1|2|3|4|5|6|7`
- */
-class TIntMask extends TInt
-{
- /** @var non-empty-array<TLiteralInt|TClassConstant> */
- public $values;
-
- /** @param non-empty-array<TLiteralInt|TClassConstant> $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<lowercase-string, string> $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 70e5645..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntMaskOf.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Represents the type that is the result of a bitmask combination of its parameters.
- * This is the same concept as TIntMask but TIntMaskOf is used with with a reference to constants in code
- * `int-mask<MyClass::CLASS_CONSTANT_*>` 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<lowercase-string, string> $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 5b2adcd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIntRange.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use function max;
-use function min;
-
-/**
- * Denotes an interval of integers between two bounds
- */
-class TIntRange extends TInt
-{
- public const BOUND_MIN = 'min';
- public const BOUND_MAX = 'max';
-
- /**
- * @var int|null
- */
- public $min_bound;
- /**
- * @var int|null
- */
- public $max_bound;
-
- public function __construct(?int $min_bound, ?int $max_bound)
- {
- $this->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<lowercase-string, string> $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 b7aea22..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TIterable.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function array_merge;
-use function count;
-use function implode;
-use function substr;
-
-/**
- * denotes the `iterable` type(which can also result from an `is_iterable` check).
- */
-class TIterable extends Atomic
-{
- use HasIntersectionTrait;
- use GenericTrait;
-
- /**
- * @var array{Union, Union}
- */
- public $type_params;
-
- /**
- * @var string
- */
- public $value = 'iterable';
-
- /**
- * @var bool
- */
- public $has_docblock_params = false;
-
- /**
- * @param list<Union> $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<lowercase-string, string> $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 05d2e71..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyOfClassConstant.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use function preg_quote;
-use function preg_replace;
-use function stripos;
-use function strpos;
-use function strtolower;
-
-/**
- * Represents an offset of a class constant array.
- */
-class TKeyOfClassConstant extends Scalar
-{
- /** @var string */
- public $fq_classlike_name;
-
- /** @var string */
- public $const_name;
-
- public function __construct(string $fq_classlike_name, string $const_name)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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-of<static::' . $this->const_name . '>';
- }
-
- if ($this->fq_classlike_name === $this_class) {
- return 'key-of<self::' . $this->const_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 e3b7399..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TKeyedArray.php
+++ /dev/null
@@ -1,434 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-use UnexpectedValueException;
-
-use function addslashes;
-use function array_keys;
-use function array_map;
-use function count;
-use function get_class;
-use function implode;
-use function is_int;
-use function is_string;
-use function preg_match;
-use function sort;
-use function str_replace;
-
-/**
- * Represents an 'object-like array' - an array with known keys.
- */
-class TKeyedArray extends Atomic
-{
- /**
- * @var non-empty-array<string|int, Union>
- */
- public $properties;
-
- /**
- * @var array<string, bool>|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<string|int, Union> $properties
- * @param array<string, bool> $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<lowercase-string, string> $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<lowercase-string, string> $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 e6a7a47..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TList.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function get_class;
-
-/**
- * Represents an array that has some particularities:
- * - its keys are integers
- * - they start at 0
- * - they are consecutive and go upwards (no negative int)
- */
-class TList extends Atomic
-{
- /**
- * @var Union
- */
- public $type_param;
-
- public const KEY = 'list';
-
- /**
- * Constructs a new instance of a list
- */
- public function __construct(Union $type_param)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 a36429d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralClassString.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use function preg_quote;
-use function preg_replace;
-use function stripos;
-use function strpos;
-use function strtolower;
-
-/**
- * Denotes a specific class string, generated by expressions like `A::class`.
- */
-class TLiteralClassString extends TLiteralString
-{
- /**
- * Whether or not this type can represent a child of the class named in $value
- * @var bool
- */
- public $definite_class = false;
-
- public function __construct(string $value, bool $definite_class = false)
- {
- parent::__construct($value);
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 05a7819..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralFloat.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a floating point value where the exact numeric value is known.
- */
-class TLiteralFloat extends TFloat
-{
- /** @var float */
- public $value;
-
- public function __construct(float $value)
- {
- $this->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<lowercase-string, string> $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 282dae1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralInt.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an integer value where the exact numeric value is known.
- */
-class TLiteralInt extends TInt
-{
- /** @var int */
- public $value;
-
- public function __construct(int $value)
- {
- $this->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<lowercase-string, string> $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 e19cfb8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLiteralString.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use function addcslashes;
-use function mb_strlen;
-use function mb_substr;
-
-/**
- * Denotes a string whose value is known.
- */
-class TLiteralString extends TString
-{
- /** @var string */
- public $value;
-
- public function __construct(string $value)
- {
- $this->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<lowercase-string, string> $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 b1b34cd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TLowercaseString.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-class TLowercaseString extends TString
-{
- public function getId(bool $nested = false): string
- {
- return 'lowercase-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/TMixed.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php
deleted file mode 100644
index 00aaa08..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TMixed.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `mixed` type, used when you don’t know the type of an expression.
- */
-class TMixed extends Atomic
-{
- /** @var bool */
- public $from_loop_isset = false;
-
- public function __construct(bool $from_loop_isset = false)
- {
- $this->from_loop_isset = $from_loop_isset;
- }
-
- public function __toString(): string
- {
- return 'mixed';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'mixed';
- }
-
- /**
- * @param array<lowercase-string, string> $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 e9eebc9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNamedObject.php
+++ /dev/null
@@ -1,160 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Type;
-use Psalm\Type\Atomic;
-
-use function array_map;
-use function implode;
-use function strrpos;
-use function substr;
-
-/**
- * Denotes an object type where the type of the object is known e.g. `Exception`, `Throwable`, `Foo\Bar`
- */
-class TNamedObject extends Atomic
-{
- use HasIntersectionTrait;
-
- /**
- * @var string
- */
- public $value;
-
- /**
- * @var bool
- */
- public $was_static = false;
-
- /**
- * Whether or not this type can represent a child of the class named in $value
- * @var bool
- */
- public $definite_class = false;
-
- /**
- * @param string $value the name of the object
- */
- public function __construct(string $value, bool $was_static = false, bool $definite_class = false)
- {
- if ($value[0] === '\\') {
- $value = substr($value, 1);
- }
-
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 1b972d0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNever.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `no-return`/`never-return` type for functions that never return, either throwing an exception or
- * terminating (like the builtin `exit()`).
- */
-class TNever extends Atomic
-{
- public function __toString(): string
- {
- return 'never';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'never';
- }
-
- /**
- * @param array<lowercase-string, string> $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 8dce93d..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyArray.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes array known to be non-empty of the form `non-empty-array<TKey, TValue>`.
- * 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 cf18019..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyList.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Represents a non-empty list
- */
-class TNonEmptyList extends TList
-{
- /**
- * @var int|null
- */
- public $count;
-
- public const KEY = 'non-empty-list';
-
- public function getAssertionString(bool $exact = false): string
- {
- return 'non-empty-list';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php
deleted file mode 100644
index 1d331e8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a non-empty-string where every character is lowercased. (which can also result from a `strtolower` call).
- */
-class TNonEmptyLowercaseString extends TNonEmptyString
-{
- public function getId(bool $nested = false): string
- {
- return 'non-empty-lowercase-string';
- }
-
- /**
- * @return 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/TNonEmptyMixed.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php
deleted file mode 100644
index bbf0ab4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyMixed.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `mixed` type, but not empty.
- * Generated for `$x` inside the `if` statement `if ($x) {...}` when `$x` is `mixed` outside.
- */
-class TNonEmptyMixed extends TMixed
-{
- public function getId(bool $nested = false): string
- {
- return 'non-empty-mixed';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php
deleted file mode 100644
index b72b22b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `literal-string` type, where the exact value is unknown but
- * we know that the string is not from user input
- */
-class TNonEmptyNonspecificLiteralString extends TNonspecificLiteralString
-{
- public function getId(bool $nested = false): string
- {
- return 'non-empty-literal-string';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php
deleted file mode 100644
index faa5536..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyScalar.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a `scalar` type that is also non-empty.
- */
-class TNonEmptyScalar extends TScalar
-{
- public function getId(bool $nested = false): string
- {
- return 'non-empty-scalar';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php
deleted file mode 100644
index 4063e48..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonEmptyString.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a string, that is also non-empty (every string except '')
- */
-class TNonEmptyString extends TString
-{
- public function getId(bool $nested = false): string
- {
- return 'non-empty-string';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php
deleted file mode 100644
index 2f58315..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonFalsyString.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a string, that is also non-falsy (every string except '' and '0')
- */
-class TNonFalsyString extends TNonEmptyString
-{
- public function getId(bool $nested = false): string
- {
- return 'non-falsy-string';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php
deleted file mode 100644
index 8a04903..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `literal-int` type, where the exact value is unknown but
- * we know that the int is not from user input
- */
-class TNonspecificLiteralInt extends TInt
-{
- public function __toString(): string
- {
- return 'literal-int';
- }
-
- public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool
- {
- return false;
- }
-
- public function getAssertionString(bool $exact = false): string
- {
- return 'int';
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php
deleted file mode 100644
index 30d6ac9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNonspecificLiteralString.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `literal-string` type, where the exact value is unknown but
- * we know that the string is not from user input
- */
-class TNonspecificLiteralString extends TString
-{
- public function __toString(): string
- {
- return 'literal-string';
- }
-
- 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/TNull.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php
deleted file mode 100644
index d95759e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNull.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `null` type
- */
-class TNull extends Atomic
-{
- public function __toString(): string
- {
- return 'null';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'null';
- }
-
- /**
- * @param array<lowercase-string, string> $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 8651ff1..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumeric.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `numeric` type (which can also result from an `is_numeric` check).
- */
-class TNumeric extends Scalar
-{
- public function __toString(): string
- {
- return 'numeric';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'numeric';
- }
-
- /**
- * @param array<lowercase-string, string> $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 c86027a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TNumericString.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a string that's also a numeric value e.g. `"5"`. It can result from `is_string($s) && is_numeric($s)`.
- */
-class TNumericString extends TNonEmptyString
-{
- public function getKey(bool $include_extra = true): string
- {
- return 'numeric-string';
- }
-
- public function __toString(): string
- {
- return 'numeric-string';
- }
-
- public function getId(bool $nested = false): string
- {
- return $this->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 e2a8721..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObject.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `object` type
- */
-class TObject extends Atomic
-{
- public function __toString(): string
- {
- return 'object';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'object';
- }
-
- /**
- * @param array<lowercase-string, string> $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 fa68b79..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TObjectWithProperties.php
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Type\TemplateInferredTypeReplacer;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Internal\Type\TemplateStandinTypeReplacer;
-use Psalm\Type\Atomic;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Union;
-
-use function array_keys;
-use function array_map;
-use function array_merge;
-use function array_values;
-use function count;
-use function implode;
-
-/**
- * Denotes an object with specified member variables e.g. `object{foo:int, bar:string}`.
- */
-class TObjectWithProperties extends TObject
-{
- use HasIntersectionTrait;
-
- /**
- * @var array<string|int, Union>
- */
- public $properties;
-
- /**
- * @var array<string, string>
- */
- public $methods;
-
- /**
- * Constructs a new instance of a generic type
- *
- * @param array<string|int, Union> $properties
- * @param array<string, string> $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<lowercase-string, string> $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<lowercase-string, string> $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 4e45ef0..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TPositiveInt.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes an int that is also positive (strictly > 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<lowercase-string, string> $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 49ee650..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TResource.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `resource` type (e.g. a file handle).
- */
-class TResource extends Atomic
-{
- public function __toString(): string
- {
- return 'resource';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'resource';
- }
-
- /**
- * @param array<lowercase-string, string> $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 0cb6f0b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TScalar.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `scalar` super type (which can also result from an `is_scalar` check).
- * This type encompasses `float`, `int`, `bool` and `string`.
- */
-class TScalar extends Scalar
-{
- public function __toString(): string
- {
- return 'scalar';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'scalar';
- }
-
- /**
- * @param array<lowercase-string, string> $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 13db202..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TSingleLetter.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a string that has a length of 1
- */
-class TSingleLetter extends TString
-{
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php
deleted file mode 100644
index 7312b16..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TString.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `string` type, where the exact value is unknown.
- */
-class TString extends Scalar
-{
- /**
- * @param array<lowercase-string, string> $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 72e72c3..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-class TTemplateIndexedAccess extends Atomic
-{
- /**
- * @var string
- */
- public $array_param_name;
-
- /**
- * @var string
- */
- public $offset_param_name;
-
- /**
- * @var string
- */
- public $defining_class;
-
- public function __construct(
- string $array_param_name,
- string $offset_param_name,
- string $defining_class
- ) {
- $this->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<lowercase-string, string> $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 01e1dbc..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateKeyOf.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Union;
-
-/**
- * Represents the type used when using TKeyOfClassConstant when the type of the class constant array is a template
- */
-class TTemplateKeyOf extends TArrayKey
-{
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var string
- */
- public $defining_class;
-
- /**
- * @var Union
- */
- public $as;
-
- public function __construct(
- string $param_name,
- string $defining_class,
- Union $as
- ) {
- $this->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<lowercase-string, string> $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 66c0af8..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParam.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Codebase;
-use Psalm\Internal\Type\TemplateResult;
-use Psalm\Type\Atomic;
-use Psalm\Type\Union;
-
-use function array_map;
-use function implode;
-
-/**
- * denotes a template parameter that has been previously specified in a `@template` tag.
- */
-class TTemplateParam extends Atomic
-{
- use HasIntersectionTrait;
-
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var Union
- */
- public $as;
-
- /**
- * @var string
- */
- public $defining_class;
-
- public function __construct(string $param_name, Union $extends, string $defining_class)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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 bd68312..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTemplateParamClass.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes a `class-string` corresponding to a template parameter previously specified in a `@template` tag.
- */
-class TTemplateParamClass extends TClassString
-{
- /**
- * @var string
- */
- public $param_name;
-
- /**
- * @var string
- */
- public $defining_class;
-
- public function __construct(
- string $param_name,
- string $as,
- ?TNamedObject $as_type,
- string $defining_class
- ) {
- $this->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<lowercase-string, string> $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 65008a4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTraitString.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `trait-string` type, used to describe a string representing a valid PHP trait.
- */
-class TTraitString extends TString
-{
- public function getKey(bool $include_extra = true): string
- {
- return 'trait-string';
- }
-
- public function __toString(): string
- {
- return $this->getKey();
- }
-
- public function getId(bool $nested = false): string
- {
- return $this->getKey();
- }
-
- /**
- * @param array<lowercase-string, string> $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<lowercase-string, string> $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 208c70e..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTrue.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-/**
- * Denotes the `true` value type
- */
-class TTrue extends TBool
-{
- /** @var true */
- public $value = true;
-
- public function __toString(): string
- {
- return 'true';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'true';
- }
-
- public function canBeFullyExpressedInPhp(int $php_major_version, int $php_minor_version): bool
- {
- return false;
- }
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php b/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php
deleted file mode 100644
index 7886691..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TTypeAlias.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-use function array_map;
-use function implode;
-
-class TTypeAlias extends Atomic
-{
- /**
- * @var array<string, TTypeAlias>|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<lowercase-string, string> $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 cbeb6b4..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TValueOfClassConstant.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type;
-use Psalm\Type\Atomic;
-
-/**
- * Represents a value of a class constant array.
- */
-class TValueOfClassConstant extends Atomic
-{
- /** @var string */
- public $fq_classlike_name;
-
- /** @var string */
- public $const_name;
-
- public function __construct(string $fq_classlike_name, string $const_name)
- {
- $this->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<lowercase-string, string> $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<lowercase-string, string> $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-of<static::' . $this->const_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 cec58cd..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Atomic/TVoid.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace Psalm\Type\Atomic;
-
-use Psalm\Type\Atomic;
-
-/**
- * Denotes the `void` type, normally just used to annotate a function/method that returns nothing
- */
-class TVoid extends Atomic
-{
- public function __toString(): string
- {
- return 'void';
- }
-
- public function getKey(bool $include_extra = true): string
- {
- return 'void';
- }
-
- /**
- * @param array<lowercase-string, string> $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 d33325a..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/NodeVisitor.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-abstract class NodeVisitor
-{
- public const STOP_TRAVERSAL = 1;
- public const DONT_TRAVERSE_CHILDREN = 2;
-
- /**
- * @return self::STOP_TRAVERSAL|self::DONT_TRAVERSE_CHILDREN|null
- */
- abstract protected function enterNode(TypeNode $type): ?int;
-
- /**
- * @return bool - true if we want to continue traversal, false otherwise
- */
- public function traverse(TypeNode $node): bool
- {
- $visitor_result = $this->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<TypeNode> $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 60e042b..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Reconciler.php
+++ /dev/null
@@ -1,1110 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-use InvalidArgumentException;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\Analyzer\StatementsAnalyzer;
-use Psalm\Internal\Codebase\TaintFlowGraph;
-use Psalm\Internal\Codebase\VariableUseGraph;
-use Psalm\Internal\MethodIdentifier;
-use Psalm\Internal\Type\AssertionReconciler;
-use Psalm\Internal\Type\TypeExpander;
-use Psalm\Issue\DocblockTypeContradiction;
-use Psalm\Issue\PsalmInternalError;
-use Psalm\Issue\RedundantCondition;
-use Psalm\Issue\RedundantConditionGivenDocblockType;
-use Psalm\Issue\RedundantPropertyInitializationCheck;
-use Psalm\Issue\TypeDoesNotContainNull;
-use Psalm\Issue\TypeDoesNotContainType;
-use Psalm\IssueBuffer;
-use Psalm\Type;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TArrayKey;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TEmpty;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TKeyedArray;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNull;
-use Psalm\Type\Atomic\TObject;
-use Psalm\Type\Atomic\TScalar;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Union;
-use ReflectionProperty;
-use UnexpectedValueException;
-
-use function array_merge;
-use function array_pop;
-use function array_shift;
-use function array_values;
-use function count;
-use function explode;
-use function implode;
-use function is_numeric;
-use function json_decode;
-use function ksort;
-use function preg_match;
-use function preg_quote;
-use function str_replace;
-use function str_split;
-use function strpos;
-use function strtolower;
-use function substr;
-
-class Reconciler
-{
- public const RECONCILIATION_OK = 0;
- public const RECONCILIATION_REDUNDANT = 1;
- public const RECONCILIATION_EMPTY = 2;
-
- /** @var array<string, non-empty-list<string>> */
- private static $broken_paths = [];
-
- /**
- * Takes two arrays and consolidates them, removing null values from existing types where applicable
- *
- * @param array<string, array<array<int, string>>> $new_types
- * @param array<string, array<array<int, string>>> $active_new_types - types we can complain about
- * @param array<string, Union> $existing_types
- * @param array<string, bool> $changed_var_ids
- * @param array<string, bool> $referenced_var_ids
- * @param array<string, array<string, Union>> $template_type_map
- *
- * @return array<string, Union>
- */
- 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<string, array<int, array<int, string>>> */
- $data = json_decode(substr($new_type_part_part, 2), true);
- } else {
- $nested_negated = $negated;
- /** @var array<string, array<int, array<int, string>>> */
- $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<string, array<array<int, string>>> $new_types
- * @param array<string, Union> $existing_types
- *
- * @return array<string, array<array<int, string>>>
- */
- 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<string>
- */
- 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<string, Union> $existing_keys
- * @param array<string,mixed> $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<string, Union> $existing_types
- * @param array<string, bool> $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 b5022d9..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/TaintKind.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-/**
- * An Enum class holding all the taint types that Psalm recognises
- */
-class TaintKind
-{
- public const INPUT_CALLABLE = 'callable';
- public const INPUT_UNSERIALIZE = 'unserialize';
- public const INPUT_INCLUDE = 'include';
- public const INPUT_EVAL = 'eval';
- public const INPUT_LDAP = 'ldap';
- public const INPUT_SQL = 'sql';
- public const INPUT_HTML = 'html';
- public const INPUT_HAS_QUOTES = 'has_quotes';
- public const INPUT_SHELL = 'shell';
- public const INPUT_SSRF = 'ssrf';
- public const INPUT_FILE = 'file';
- public const INPUT_COOKIE = 'cookie';
- public const INPUT_HEADER = 'header';
- public const USER_SECRET = 'user_secret';
- public const SYSTEM_SECRET = 'system_secret';
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php b/vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php
deleted file mode 100644
index de1b365..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/TaintKindGroup.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-/**
- * An Enum class holding all the taint types that Psalm recognises
- */
-class TaintKindGroup
-{
- public const ALL_INPUT = [
- TaintKind::INPUT_HTML,
- TaintKind::INPUT_HAS_QUOTES,
- TaintKind::INPUT_SHELL,
- TaintKind::INPUT_SQL,
- TaintKind::INPUT_CALLABLE,
- TaintKind::INPUT_EVAL,
- TaintKind::INPUT_UNSERIALIZE,
- TaintKind::INPUT_INCLUDE,
- TaintKind::INPUT_SSRF,
- TaintKind::INPUT_LDAP,
- TaintKind::INPUT_FILE,
- TaintKind::INPUT_HEADER,
- TaintKind::INPUT_COOKIE,
- ];
-}
diff --git a/vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php b/vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php
deleted file mode 100644
index 6bdc054..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/TypeNode.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-interface TypeNode
-{
- /**
- * @return array<TypeNode>
- */
- 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 6ff34be..0000000
--- a/vendor/vimeo/psalm/src/Psalm/Type/Union.php
+++ /dev/null
@@ -1,1668 +0,0 @@
-<?php
-
-namespace Psalm\Type;
-
-use InvalidArgumentException;
-use Psalm\CodeLocation;
-use Psalm\Codebase;
-use Psalm\Internal\DataFlow\DataFlowNode;
-use Psalm\Internal\Type\TypeCombiner;
-use Psalm\Internal\TypeVisitor\ContainsClassLikeVisitor;
-use Psalm\Internal\TypeVisitor\ContainsLiteralVisitor;
-use Psalm\Internal\TypeVisitor\FromDocblockSetter;
-use Psalm\Internal\TypeVisitor\TemplateTypeCollector;
-use Psalm\Internal\TypeVisitor\TypeChecker;
-use Psalm\Internal\TypeVisitor\TypeScanner;
-use Psalm\StatementsSource;
-use Psalm\Storage\FileStorage;
-use Psalm\Type;
-use Psalm\Type\Atomic\Scalar;
-use Psalm\Type\Atomic\TArray;
-use Psalm\Type\Atomic\TCallable;
-use Psalm\Type\Atomic\TClassString;
-use Psalm\Type\Atomic\TClassStringMap;
-use Psalm\Type\Atomic\TClosure;
-use Psalm\Type\Atomic\TConditional;
-use Psalm\Type\Atomic\TEmptyMixed;
-use Psalm\Type\Atomic\TFalse;
-use Psalm\Type\Atomic\TFloat;
-use Psalm\Type\Atomic\TInt;
-use Psalm\Type\Atomic\TIntRange;
-use Psalm\Type\Atomic\TList;
-use Psalm\Type\Atomic\TLiteralFloat;
-use Psalm\Type\Atomic\TLiteralInt;
-use Psalm\Type\Atomic\TLiteralString;
-use Psalm\Type\Atomic\TLowercaseString;
-use Psalm\Type\Atomic\TMixed;
-use Psalm\Type\Atomic\TNamedObject;
-use Psalm\Type\Atomic\TNonEmptyLowercaseString;
-use Psalm\Type\Atomic\TNonspecificLiteralInt;
-use Psalm\Type\Atomic\TNonspecificLiteralString;
-use Psalm\Type\Atomic\TPositiveInt;
-use Psalm\Type\Atomic\TString;
-use Psalm\Type\Atomic\TTemplateParam;
-use Psalm\Type\Atomic\TTemplateParamClass;
-use Psalm\Type\Atomic\TTrue;
-use UnexpectedValueException;
-
-use function array_filter;
-use function array_merge;
-use function array_unique;
-use function count;
-use function get_class;
-use function implode;
-use function ksort;
-use function reset;
-use function sort;
-use function strpos;
-
-class Union implements TypeNode
-{
- /**
- * @var non-empty-array<string, Atomic>
- */
- 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<string, TLiteralString>
- */
- private $literal_string_types = [];
-
- /**
- * @var array<string, TClassString>
- */
- private $typed_class_strings = [];
-
- /**
- * @var array<string, TLiteralInt>
- */
- private $literal_int_types = [];
-
- /**
- * @var array<string, TLiteralFloat>
- */
- 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<string, DataFlowNode>
- */
- public $parent_nodes = [];
-
- /**
- * @var bool
- */
- public $different = false;
-
- /**
- * Constructs an Union instance
- *
- * @param non-empty-array<int, Atomic> $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<string, Atomic> $types
- */
- public function replaceTypes(array $types): void
- {
- $this->types = $types;
- }
-
- /**
- * @psalm-mutation-free
- * @return non-empty-array<string, Atomic>
- */
- 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<lowercase-string, string> $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<lowercase-string, string> $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<string, TCallable>
- */
- public function getCallableTypes(): array
- {
- return array_filter(
- $this->types,
- function ($type): bool {
- return $type instanceof TCallable;
- }
- );
- }
-
- /**
- * @return array<string, TClosure>
- */
- 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<string> $suppressed_issues
- * @param array<string, bool> $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<string, mixed> $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<TTemplateParam>
- */
- 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<string, TLiteralString>
- */
- public function getLiteralStrings(): array
- {
- return $this->literal_string_types;
- }
-
- /**
- * @return array<string, TLiteralInt>
- */
- public function getLiteralInts(): array
- {
- return $this->literal_int_types;
- }
-
- /**
- * @return array<string, TIntRange>
- */
- public function getRangeInts(): array
- {
- $ranges = [];
- foreach ($this->getAtomicTypes() as $atomic) {
- if ($atomic instanceof TIntRange) {
- $ranges[$atomic->getKey()] = $atomic;
- }
- }
-
- return $ranges;
- }
-
- /**
- * @return array<string, TLiteralFloat>
- */
- public function getLiteralFloats(): array
- {
- return $this->literal_float_types;
- }
-
- /**
- * @return array<string, Atomic>
- */
- 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 4a797d8..0000000
--- a/vendor/vimeo/psalm/src/command_functions.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Composer\Autoload\ClassLoader;
-use Psalm\Internal\CliUtils;
-
-// phpcs:disable PSR1.Files.SideEffects
-require_once __DIR__ . '/Psalm/Internal/CliUtils.php';
-
-/** @deprecated going to be removed in Psalm 5 */
-function requireAutoloaders(string $current_dir, bool $has_explicit_root, string $vendor_dir): ?ClassLoader
-{
- return CliUtils::requireAutoloaders($current_dir, $has_explicit_root, $vendor_dir);
-}
-
-/** @deprecated going to be removed in Psalm 5 */
-function getVendorDir(string $current_dir): string
-{
- return CliUtils::getVendorDir($current_dir);
-}
-
-/**
- * @return list<string>
- * @deprecated going to be removed in Psalm 5
- */
-function getArguments(): array
-{
- return CliUtils::getArguments();
-}
-
-/**
- * @param string|array|null|false $f_paths
- *
- * @return list<string>|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 a44e53c..0000000
--- a/vendor/vimeo/psalm/src/functions.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Psalm;
-
-use Webmozart\PathUtil\Path;
-
-/**
- * @deprecated Use {@see Webmozart\PathUtil\Path::isAbsolute}. No longer used by Psalm, going to be removed in Psalm 5
- */
-function isAbsolutePath(string $path): bool
-{
- return Path::isAbsolute($path);
-}
diff --git a/vendor/vimeo/psalm/src/psalm-language-server.php b/vendor/vimeo/psalm/src/psalm-language-server.php
deleted file mode 100644
index a303e2d..0000000
--- a/vendor/vimeo/psalm/src/psalm-language-server.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @deprecated This file is going to be removed in Psalm 5
- */
-use Psalm\Internal\Cli\LanguageServer;
-
-/** */
-require_once __DIR__ . '/Psalm/Internal/Cli/LanguageServer.php';
-LanguageServer::run($argv);
diff --git a/vendor/vimeo/psalm/src/psalm-refactor.php b/vendor/vimeo/psalm/src/psalm-refactor.php
deleted file mode 100644
index 6943cd1..0000000
--- a/vendor/vimeo/psalm/src/psalm-refactor.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @deprecated This file is going to be removed in Psalm 5
- */
-use Psalm\Internal\Cli\Refactor;
-
-/** */
-require_once __DIR__ . '/Psalm/Internal/Cli/Refactor.php';
-Refactor::run($argv);
diff --git a/vendor/vimeo/psalm/src/psalm.php b/vendor/vimeo/psalm/src/psalm.php
deleted file mode 100644
index dabe290..0000000
--- a/vendor/vimeo/psalm/src/psalm.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @deprecated This file is going to be removed in Psalm 5
- */
-use Psalm\Internal\Cli\Psalm;
-
-/** */
-require __DIR__ . '/Psalm/Internal/Cli/Psalm.php';
-Psalm::run($argv);
diff --git a/vendor/vimeo/psalm/src/psalm_plugin.php b/vendor/vimeo/psalm/src/psalm_plugin.php
deleted file mode 100644
index 6492882..0000000
--- a/vendor/vimeo/psalm/src/psalm_plugin.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @deprecated This file is going to be removed in Psalm 5
- */
-use Psalm\Internal\Cli\Plugin;
-
-/** */
-require_once __DIR__ . '/Psalm/Internal/Cli/Plugin.php';
-Plugin::run();
diff --git a/vendor/vimeo/psalm/src/psalter.php b/vendor/vimeo/psalm/src/psalter.php
deleted file mode 100644
index ce0271d..0000000
--- a/vendor/vimeo/psalm/src/psalter.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @deprecated This file is going to be removed in Psalm 5
- */
-use Psalm\Internal\Cli\Psalter;
-
-/** */
-require_once __DIR__ . '/Psalm/Internal/Cli/Psalter.php';
-Psalter::run($argv);
diff --git a/vendor/vimeo/psalm/src/spl_object_id.php b/vendor/vimeo/psalm/src/spl_object_id.php
deleted file mode 100644
index 8b30da9..0000000
--- a/vendor/vimeo/psalm/src/spl_object_id.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * PHP Polyfill for spl_object_id() for PHP <= 7.1
- * This file will be included even in releases which will analyze PHP 7.2,
- * there aren't any major compatibilities preventing analysis of PHP 7.2 from running in PHP 7.1.
- */
-if (!function_exists('spl_object_id')) {
- if (function_exists('runkit_object_id') &&
- !(new ReflectionFunction('runkit_object_id'))->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 0dae5ef..0000000
--- a/vendor/vimeo/psalm/stubs/CoreGenericClasses.phpstub
+++ /dev/null
@@ -1,503 +0,0 @@
-<?php
-
-/**
- * Interface to detect if a class is traversable using &foreach;.
- * @link http://php.net/manual/en/class.traversable.php
- *
- * @template-covariant TKey
- * @template-covariant TValue
- */
-interface Traversable {
-}
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- * @template TSend
- * @template-covariant TReturn
- *
- * @template-implements Traversable<TKey, TValue>
- */
-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<TKey, TValue>
- * @template-implements ArrayAccess<TKey, TValue>
- */
-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<TKey, TValue>|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<ArrayIterator<TKey,TValue>>|class-string<ArrayObject<TKey,TValue>> $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<TKey, TValue> 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.
- *
- * <table>
- * ArrayObject behavior flags
- * <tr valign="top">
- * <td>value</td>
- * <td>constant</td>
- * </tr>
- * <tr valign="top">
- * <td>1</td>
- * <td>
- * ArrayObject::STD_PROP_LIST
- * </td>
- * </tr>
- * <tr valign="top">
- * <td>2</td>
- * <td>
- * ArrayObject::ARRAY_AS_PROPS
- * </td>
- * </tr>
- * </table>
- *
- * @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 <i>cmp_function</i> 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 <i>cmp_function</i> 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<TKey, TValue> 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<ArrayIterator<TKey,TValue>>|class-string<ArrayObject<TKey,TValue>> $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<ArrayIterator<TKey,TValue>>|class-string<ArrayObject<TKey,TValue>>
- *
- * @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<TIn>
- */
- public static function create(object $referent): WeakReference {}
-
- /** @return ?T */
- public function get(): ?object {}
-}
-
-/**
- * @template TKey of object
- * @template TVal of mixed
- * @implements ArrayAccess<TKey, TVal>
- * @implements IteratorAggregate<TKey,TVal>
- * @implements Traversable<TKey,TVal>
- *
- * @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 54bd9d8..0000000
--- a/vendor/vimeo/psalm/stubs/CoreGenericFunctions.phpstub
+++ /dev/null
@@ -1,1368 +0,0 @@
-<?php
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TArray as array<TKey, mixed>
- *
- * @param TArray $array
- * @param mixed $search_value
- * @param bool $strict
- *
- * @return (TArray is non-empty-array ? non-empty-list<TKey> : list<TKey>)
- * @psalm-pure
- */
-function array_keys(array $array, $search_value = null, bool $strict = false)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_intersect(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_intersect_key(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_intersect_assoc(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<mixed, TKey> $keys
- * @param array<mixed, TValue> $values
- *
- * @return (
- * PHP_MAJOR_VERSION is 8 ?
- * ($keys is non-empty-array ? non-empty-array<TKey, TValue> : array<TKey, TValue>) :
- * ($keys is non-empty-array ? non-empty-array<TKey, TValue>|false : array<TKey, TValue>|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<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_diff(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_diff_key(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- * @param array ...$arrays
- *
- * @return array<TKey, TValue>
- * @psalm-pure
- */
-function array_diff_assoc(array $array, array ...$arrays)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> $array
- *
- * @return array<TValue, TKey>
- * @psalm-pure
- */
-function array_flip(array $array)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TArray as array<TKey, mixed>
- *
- * @param TArray $array
- *
- * @return (TArray is array<empty, empty> ? null : TKey|null)
- * @psalm-pure
- * @psalm-ignore-nullable-return
- */
-function key($array)
-{
-}
-
-/**
- * @psalm-template TKey as array-key
- * @psalm-template TArray as array<TKey, mixed>
- *
- * @param TArray $array
- *
- * @return (TArray is array<empty, empty> ? 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<TKey, mixed>
- *
- * @param TArray $array
- *
- * @return (TArray is array<empty, empty> ? null : (TArray is non-empty-array ? TKey : TKey|null))
- * @psalm-pure
- */
-function array_key_last($array)
-{
-}
-
-/**
- * @psalm-template T
- *
- * @param mixed $needle
- * @param array<T, mixed> $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<T>
- *
- * @param TArray $array
- * @param-out (TArray is non-empty-array ? non-empty-list<T> : list<T>) $array
- */
-function shuffle(array &$array): bool
-{
-}
-
-/**
- * @psalm-template T
- * @psalm-template TArray as array<T>
- *
- * @param TArray $array
- * @param-out (TArray is non-empty-array ? non-empty-list<T> : list<T>) $array
- */
-function sort(array &$array, int $flags = SORT_REGULAR): bool
-{
-}
-
-/**
- * @psalm-template T
- * @psalm-template TArray as array<T>
- *
- * @param TArray $array
- * @param-out (TArray is non-empty-array ? non-empty-list<T> : list<T>) $array
- */
-function rsort(array &$array, int $flags = SORT_REGULAR): bool
-{
-}
-
-/**
- * @psalm-template T
- * @psalm-template TArray as array<T>
- *
- * @param TArray $array
- * @param callable(T,T):int $callback
- * @param-out (TArray is non-empty-array ? non-empty-list<T> : list<T>) $array
- */
-function usort(array &$array, callable $callback): bool
-{
-}
-
-/**
- * @psalm-template TKey
- * @psalm-template T
- * @psalm-template TArray as array<TKey,T>
- *
- * @param TArray $array
- * @param callable(T,T):int $callback
- * @param-out (TArray is non-empty-array ? non-empty-array<TKey,T> : array<TKey,T>) $array
- */
-function uasort(array &$array, callable $callback): bool
-{
-}
-
-/**
- * @psalm-template TKey
- * @psalm-template T
- * @psalm-template TArray as array<TKey,T>
- *
- * @param TArray $array
- * @param callable(TKey,TKey):int $callback
- * @param-out (TArray is non-empty-array ? non-empty-array<TKey,T> : array<TKey,T>) $array
- */
-function uksort(array &$array, callable $callback): bool
-{
-}
-
-/**
- * @psalm-pure
- *
- * @psalm-template K of array-key
- * @psalm-template T
- *
- * @param array<K,T> $array
- *
- * @return array<K,T>
- */
-function array_change_key_case(array $array, int $case = CASE_LOWER)
-{
-}
-
-/**
- * @psalm-pure
- *
- * @psalm-template TKey as array-key
- *
- * @param TKey $key
- * @param array<TKey, mixed> $array
- *
- * @return bool
- */
-function array_key_exists($key, array $array) : bool
-{
-}
-
-/**
- * @psalm-pure
- *
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey, TValue> ...$arrays
- *
- * @return array<TKey, TValue>
- */
-function array_merge_recursive(array ...$arrays)
-{
-}
-
-/**
- * @psalm-pure
- *
- * @psalm-template TKey as array-key
- * @psalm-template TValue
- *
- * @param array<TKey> $keys
- * @param TValue $value
- *
- * @return array<TKey, TValue>
- */
-function array_fill_keys(array $keys, $value): array
-{
-}
-
-/**
- * @psalm-pure
- *
- * @psalm-template TKey
- *
- * @param string $pattern
- * @param array<TKey,string> $array
- * @param 0|1 $flags 1=PREG_GREP_INVERT
- * @return array<TKey,string>
- */
-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<mixed> $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<string, int>)
- */
-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<int> : non-empty-list<float>)
- * : (
- * T is float
- * ? non-empty-list<float>
- * : (
- * T is string
- * ? non-empty-list<string>
- * : (
- * T is int|float
- * ? non-empty-list<int|float>
- * : non-empty-list<int|float|string>
- * )
- * )
- * )
- * )
- */
-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<float|int|string|null>) : 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, string> : 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> $string
- * @param string|array<string> $replace
- * @param int|array<int> $offset
- * @param null|int|array<int> $length
- *
- * @return ($string is array<string> ? array<string> : 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<string|float|int|stringable-object|null|bool> $array
- *
- * @return (
- * $separator is non-empty-string
- * ? ($array is non-empty-array
- * ? ($array is array<literal-string|literal-int>
- * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string)
- * : non-empty-string
- * )
- * : string)
- * : ($array is non-empty-array
- * ? ($array is array<non-empty-literal-string|non-empty-string>
- * ? ($array is array<non-empty-literal-string> ? 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<string|float|int|stringable-object|null|bool> $array
- *
- * @return (
- * $separator is non-empty-string
- * ? ($array is non-empty-array
- * ? ($array is array<literal-string|literal-int>
- * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string)
- * : non-empty-string
- * )
- * : string)
- * : ($array is non-empty-array
- * ? ($array is array<non-empty-literal-string|non-empty-string>
- * ? ($array is array<non-empty-literal-string> ? 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<string>|false : (TFlags is 1|3 ? list<string>|false : list<array{string,int}>|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>
- * ? int
- * : ($array is array<float>
- * ? float
- * : float|int
- * )
- * )
- */
-function array_sum(array $array) {}
-
-/**
- * @param array $array
- *
- * @return (
- * $array is array<int>
- * ? int
- * : ($array is array<float>
- * ? 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<string|int|float> $search
- * @param string|array<string|int|float> $replace
- * @param string|array<string|int|float> $subject
- * @param int $count
- * @return ($subject is array ? array<string> : string)
- *
- * @psalm-flow ($replace, $subject) -> return
- */
-function str_replace($search, $replace, $subject, &$count = null) {}
-
-/**
- * @psalm-pure
- *
- * @param string|array<string|int|float> $search
- * @param string|array<string|int|float> $replace
- * @param string|array<string|int|float> $subject
- * @param int $count
- * @return ($subject is array ? array<string> : 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<string> : 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<string> :
- * array<int, string>
- * )
- * )
- */
-function str_word_count(string $string, int $format = 0, string|null $characters = null) {}
-
-/**
- * @psalm-pure
- *
- * @param string|string[] $pattern
- * @param string|array<string|int|float> $replacement
- * @param string|array<string|int|float> $subject
- * @param int $count
- * @return ($subject is array ? array<string> : 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<string|int|float> $replacement
- * @param string|array<string|int|float> $subject
- * @param int $count
- * @return ($subject is array ? array<string>|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<string|int|float> $subject
- * @param int $count
- * @return ($subject is array ? array<string>|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<list<string>>
- * : (TFlags is 2
- * ? list<array<string>>
- * : (TFlags is 256|257
- * ? array<list<array{string, int}>>
- * : (TFlags is 258
- * ? list<array<array{string, int}>>
- * : (TFlags is 512|513
- * ? array<list<?string>>
- * : (TFlags is 514
- * ? list<array<?string>>
- * : (TFlags is 770
- * ? list<array<array{?string, int}>>
- * : 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<array-key, array{string, 0|positive-int}|array{'', -1}> :
- * TFlags is 512 ? array<array-key, string|null> :
- * TFlags is 768 ? array<array-key, array{string, 0|positive-int}|array{null, -1}> :
- * array<array-key, string>
- * ) $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<string> : non-empty-list<string>|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<mixed, TKey>
- *
- * @param TArray $array
- *
- * @return (TArray is non-empty-array ? non-empty-array<TKey, positive-int> : array<TKey, positive-int>)
- *
- * @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<string> : array<string, string|list<string>>)|false
- *
- * @psalm-taint-sink ssrf $url
- */
-function get_headers(string $url, int $associative = 0, $context = null) : array|false {}
-
-/**
- * @psalm-pure
- *
- * @return array<lowercase-string, string>|false
- *
- * @psalm-taint-sink ssrf $filename
- */
-function get_meta_tags(string $filename, bool $use_include_path = false) : array|false {}
-
-/**
- * @return ($categorize is false ? array<string,int|string|float|bool|null|array|resource> : array<string, array<string,int|string|float|bool|null|array|resource>>)
- */
-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<int, string> ? array<int, string> : 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<array-key, resource>
- * @template TWrite of null|array<array-key, resource>
- * @template TExcept of null|array<array-key, resource>
- * @param TRead $read
- * @param TWrite $write
- * @param TExcept $except
- * @return false|int<0, max>
- * @param-out (TRead is null ? null : array<array-key, resource>) $read
- * @param-out (TWrite is null ? null : array<array-key, resource>) $write
- * @param-out (TExcept is null ? null : array<array-key, resource>) $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 c20e54d..0000000
--- a/vendor/vimeo/psalm/stubs/CoreGenericIterators.phpstub
+++ /dev/null
@@ -1,1094 +0,0 @@
-<?php
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- *
- * @template-extends Traversable<TKey, TValue>
- */
-interface IteratorAggregate extends Traversable {
-
- /**
- * @return Traversable<TKey, TValue> An instance of an object implementing Iterator or Traversable
- */
- public function getIterator();
-}
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- *
- * @template-extends Traversable<TKey, TValue>
- */
-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<TKey, TValue>
- */
-interface OuterIterator extends Iterator {
- /**
- * @return Iterator<TKey, TValue>
- */
- public function getInnerIterator();
-}
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- *
- * @template-extends Iterator<TKey, TValue>
- */
-interface RecursiveIterator extends Iterator {
-
- /**
- * @return bool true if the current entry can be iterated over, otherwise returns false.
- */
- public function hasChildren();
-
- /**
- * @return RecursiveIterator<TKey, TValue> An iterator for the current entry.
- */
- public function getChildren();
-}
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- * @template-extends Iterator<TKey, TValue>
- */
-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<TKey, TValue>
- *
- * @template-implements OuterIterator<TKey, TValue>
- *
- * @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<TKey, TValue>
- *
- * @template-extends IteratorIterator<TKey, TValue>
- */
-class AppendIterator extends IteratorIterator {
- public function __construct(){}
-
- /**
- * @param TIterator $iterator
- * @return void
- */
- public function append(Iterator $iterator) {}
-
- /**
- * @return ArrayIterator<TKey, TValue>
- */
- 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<TKey, TValue>
- * @template-implements ArrayAccess<TKey, TValue>
- */
-class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable {
- const STD_PROP_LIST = 1;
- const ARRAY_AS_PROPS = 2;
-
- /**
- * @param array<TKey, TValue> $array The array or object to be iterated on.
- * @param int-mask-of<static::*> $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<TKey, TValue> 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<self::*> The current flags.
- */
- public function getFlags() { }
-
- /**
- * @param int-mask-of<self::*> $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<TKey, TValue>
- */
-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<TKey, TValue>
- * @template-implements ArrayAccess<TKey, TValue>
- *
- * @template-extends IteratorIterator<TKey, TValue>
- */
-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<TKey, TValue> $iterator
- * @param int-mask-of<self::*> $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<TKey, TValue>
- *
- * @template-extends FilterIterator<TKey, TValue>
- */
-class CallbackFilterIterator extends FilterIterator implements OuterIterator {
- /**
- * @param Iterator<TKey, TValue> $iterator
- * @param callable(TValue, TKey, Iterator<TKey, TValue>): 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<int, DirectoryIterator>
- */
-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<empty, empty>
- */
-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<string, FilesystemIterator|SplFileInfo|string>
- */
-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<self::CURRENT_AS_PATHNAME,self::CURRENT_AS_FILEINFO,self::CURRENT_AS_SELF,self::KEY_AS_PATHNAME,self::KEY_AS_FILENAME,self::FOLLOW_SYMLINKS,self::NEW_CURRENT_AND_KEY,self::SKIP_DOTS,self::UNIX_PATHS> $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<self::CURRENT_AS_PATHNAME,self::CURRENT_AS_FILEINFO,self::CURRENT_AS_SELF,self::KEY_AS_PATHNAME,self::KEY_AS_FILENAME,self::FOLLOW_SYMLINKS,self::NEW_CURRENT_AND_KEY,self::SKIP_DOTS,self::UNIX_PATH>
- */
- public function getFlags() {}
-
- /**
- * @param int-mask<self::CURRENT_AS_PATHNAME,self::CURRENT_AS_FILEINFO,self::CURRENT_AS_SELF,self::KEY_AS_PATHNAME,self::KEY_AS_FILENAME,self::FOLLOW_SYMLINKS,self::NEW_CURRENT_AND_KEY,self::SKIP_DOTS,self::UNIX_PATH> $flags
- * @return void
- */
- public function setFlags($flags) {}
- /**
- * @return string|null
- * @psalm-ignore-nullable-return
- */
- public function key() {}
-}
-
-
-
-/**
- * @template-extends SeekableIterator<string, GlobIterator|SplFileInfo|string>
- */
-class GlobIterator extends FilesystemIterator implements Countable {
- /**
- * @return int
- */
- public function count() {}
-}
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- *
- * @template-extends IteratorIterator<TKey, TValue>
- */
-class InfiniteIterator extends IteratorIterator {
- /**
- * @param Iterator<TKey, TValue> $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<TKey, TValue>
- *
- * @template-extends IteratorIterator<TKey, TValue>
- */
-class LimitIterator extends IteratorIterator implements OuterIterator {
- /**
- * @param Iterator<TKey, TValue> $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<TKey, TValue>
- */
-class NoRewindIterator extends IteratorIterator {
- /**
- * @param Iterator<TKey, TValue> $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<TKey, TValue>
- */
-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<self::MIT_*> $flags
- */
- public function __construct (int $flags = 0) {}
- /**
- * @param Iterator<TKey,TValue> $iterator
- * @param string|int $infos
- * @return void
- */
- public function attachIterator(Iterator $iterator, $infos = '') {}
- /**
- * @param Iterator<TKey, TValue> $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<array-key, TValue|null>
- */
- public function current() {}
- /**
- * @param Iterator<TKey,TValue> $iterator
- * @return void
- */
- public function detachIterator(Iterator $iterator) {}
- /**
- * @return int-mask-of<self::MIT_*>
- */
- public function getFlags() {}
- /**
- * @return array<array-key, TValue|null>
- */
- public function key() {}
- /**
- * @param int-mask-of<self::MIT_*> $flags
- * @return void
- */
- public function setFlags( int $flags ) {}
-}
-
-/**
- * @template TKey
- * @template TValue
- *
- * @template-extends FilterIterator<TKey, TValue>
- * @template-implements RecursiveIterator<TKey, TValue>
- */
-abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator {
-
- /**
- * @param RecursiveIterator<TKey, TValue> $iterator
- */
- public function __construct(RecursiveIterator $iterator) {}
- /**
- * @return RecursiveFilterIterator<TKey, TValue>
- */
- 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<TKey, TValue>
- */
-class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator {
-
- /**
- * @return bool
- */
- public function accept() {}
- /**
- * @param RecursiveIterator<TKey, TValue> $iterator
- */
- public function __construct(RecursiveIterator $iterator) {}
- /**
- * @return ParentIterator<TKey,TValue>
- */
- 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<TKey, TValue>
- * @template-extends ArrayIterator<TKey, TValue>
- */
-class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
- const STD_PROP_LIST = 1 ;
- const ARRAY_AS_PROPS = 2 ;
- const CHILD_ARRAYS_ONLY = 4 ;
-
- /**
- * @return RecursiveArrayIterator<TKey, TValue>
- */
- 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<TKey, TValue>
- * @template-extends ArrayIterator<TKey, TValue>
- */
-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<TKey, TValue> $iterator
- * @param int-mask-of<self::*> $flags
- */
- public function __construct(Iterator $iterator, int $flags = 0) {}
- /**
- * @return RecursiveCachingIterator<TKey,TValue>
- */
- 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<TKey, TValue>
- * @template-extends CallbackFilterIterator<TKey, TValue>
- */
-class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator {
-
- /**
- * @param RecursiveIterator<TKey, TValue> $iterator
- * @param callable(TValue, TKey, RecursiveIterator<TKey, TValue>): bool $callback
- */
- public function __construct(RecursiveIterator $iterator, callable $callback) {}
- /**
- * @return RecursiveCallbackFilterIterator<TKey, TValue>
- */
- 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<string, RecursiveDirectoryIterator|string|SplFileInfo>
- * @template-implements SeekableIterator<string, RecursiveDirectoryIterator|string|SplFileInfo>
- */
-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<self::CURRENT_AS_PATHNAME,self::CURRENT_AS_FILEINFO,self::CURRENT_AS_SELF,self::KEY_AS_PATHNAME,self::KEY_AS_FILENAME,self::FOLLOW_SYMLINKS,self::NEW_CURRENT_AND_KEY,self::SKIP_DOTS,self::UNIX_PATHS> $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<TKey, TValue>
- * @template-extends RegexIterator<TKey, TValue>
- */
-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<TKey, TValue> $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<TKey, TValue>
- */
- public function getChildren() {}
-}
-
-/**
- * @template TKey
- * @template TValue
- *
- * @template-extends RecursiveIteratorIterator<TKey, TValue>
- * @template-implements OuterIterator<TKey, TValue>
- */
-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<TKey, TValue>|IteratorAggregate<TKey, TValue> $it
- * @param int-mask<self::BYPASS_CURRENT, self::BYPASS_KEY> $flags
- * @param int-mask<self::CATCH_GET_CHILD> $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<TKey, TValue>
- */
-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<TKey, TValue> $iterator
- * @param string $regex
- * @param self::MATCH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode
- * @param int-mask<self::USE_KEY> $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 405f89b..0000000
--- a/vendor/vimeo/psalm/stubs/CoreImmutableClasses.phpstub
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-
-/**
- * @psalm-immutable
- */
-class DateTimeImmutable implements DateTimeInterface
-{
- public function __construct(string $datetime = "now", DateTimeZone $timezone = null) {}
-}
-
-/**
- * @psalm-immutable
- */
-class DateTimeZone
-{
- public function __construct(string $timezone) {}
-}
-
-/**
- * @psalm-immutable
- *
- * @template-covariant Start of string|DateTimeInterface
- * @implements Traversable<int, DateTimeInterface>
- */
-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<array{file?:string,line?:int,function?:string,class?:class-string,type?:'::'|'->',args?:array<mixed>}>
- */
- 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<array{file?:string,line?:int,function?:string,class?:class-string,type?:'::'|'->',args?:array<mixed>}>
- */
- 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<array{file?:string,line?:int,function?:string,class?:class-string,type?:'::'|'->',args?:array<mixed>}>
- */
- 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 5c7630e..0000000
--- a/vendor/vimeo/psalm/stubs/DOM.phpstub
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-
-/**
- * The DOMElement class
- * @link http://php.net/manual/en/class.domelement.php
- */
-class DOMDocument extends DOMNode {
- /**
- * @return DOMNodeList<DOMElement>
- */
- public function getElementsByTagName($name) {}
-
- /**
- * @return DOMNodeList<DOMElement>
- */
- 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<DOMElement>
- */
- public function getElementsByTagName($name) {}
- /**
- * @return DOMNodeList<DOMElement>
- */
- public function getElementsByTagNameNS($namespaceURI, $localName) {}
-}
-
-/**
- * @template-covariant TNode as DOMNode
- * @template-implements Traversable<int, TNode>
- */
-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<string, TNode>
- */
-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 001ebf1..0000000
--- a/vendor/vimeo/psalm/stubs/Php80.phpstub
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-interface Stringable
-{
- /** @return string */
- function __toString();
-}
-
-/**
- * @template TClass as object
- */
-class ReflectionAttribute
-{
- const IS_INSTANCEOF = 2;
-
- private function __construct()
- {
- }
-
- public function getName() : string
- {
- }
-
- public function getTarget() : int
- {
- }
-
- public function isRepeated() : bool
- {
- }
-
- public function getArguments() : array
- {
- }
-
- /**
- * @return TClass
- */
- public function newInstance() : object
- {
- }
-
- /**
- * @return never-return
- */
- private function __clone()
- {
- }
-}
-
-class ReflectionClassConstant
-{
- public const IS_PUBLIC = 1;
- public const IS_PROTECTED = 2;
- public const IS_PRIVATE = 4;
-}
-
-class Attribute
-{
- 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 int-mask-of<self::*> $flags
- */
- public function __construct(int $flags = self::TARGET_ALL)
- {
- }
-}
-
-class ReflectionUnionType extends ReflectionType {
- /**
- * @return non-empty-list<ReflectionNamedType>
- */
- public function getTypes() {}
-}
-
-class UnhandledMatchError extends Error {}
-
-/**
- * @psalm-immutable
- *
- * @template-covariant Start of string|DateTimeInterface
- * @implements IteratorAggregate<int, DateTimeInterface>
- */
-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<int, DateTime>&Iterator) : (Traversable<int, Start>&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 694e4e9..0000000
--- a/vendor/vimeo/psalm/stubs/Php81.phpstub
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-namespace {
- interface UnitEnum {
- /** @var non-empty-string $name */
- public readonly string $name;
-
- /**
- * @psalm-pure
- * @return list<static>
- */
- 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<ReflectionEnumUnitCase> */
- 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<ReflectionType>
- */
- 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 cfbe3ba..0000000
--- a/vendor/vimeo/psalm/stubs/Reflection.phpstub
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-/**
- * @template-covariant T as object
- *
- * @property-read class-string<T> $name
- */
-class ReflectionClass implements Reflector {
-
- /**
- * @var class-string<T>
- */
- public $name;
-
- /**
- * @param T|class-string<T>|interface-string<T>|trait-string $argument
- */
- public function __construct($argument) {}
-
- /**
- * @return class-string<T>
- */
- public function getName(): string {}
-
- /**
- * @param mixed ...$args
- *
- * @return T
- */
- public function newInstance(...$args): object {}
-
- /**
- * @param array<int, mixed> $args
- *
- * @return T
- */
- public function newInstanceArgs(array $args): object {}
-
- /**
- * @return T
- */
- public function newInstanceWithoutConstructor(): object {}
-
- /**
- * @return ?array<string>
- * @psalm-ignore-nullable-return
- */
- public function getTraitNames(): array {}
-
- /**
- * @since 8.0
- * @template TClass as object
- * @param class-string<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- public function getAttributes(?string $name = null, int $flags = 0): array {}
-}
-
-class ReflectionFunction implements Reflector
-{
- /**
- * @since 8.0
- * @template TClass as object
- * @param class-string<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- public function getAttributes(?string $name = null, int $flags = 0): array {}
-}
-
-class ReflectionProperty implements Reflector
-{
- /**
- * @since 8.0
- * @template TClass as object
- * @param class-string<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- 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<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- 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<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- 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<TClass>|null $name
- * @return ($name is null ? array<ReflectionAttribute<object>> : array<ReflectionAttribute<TClass>>)
- */
- 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 90c06d9..0000000
--- a/vendor/vimeo/psalm/stubs/SPL.phpstub
+++ /dev/null
@@ -1,972 +0,0 @@
-<?php
-
-/**
- * The SplDoublyLinkedList class provides the main functionalities of a doubly linked list.
- * @link https://php.net/manual/en/class.spldoublylinkedlist.php
- *
- * @template TKey
- * @template TValue
- * @template-implements Iterator<TKey, TValue>
- * @template-implements ArrayAccess<TKey, TValue>
- */
-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<int, TValue>
- * @template-implements Iterator<int, TValue>
- */
-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<int, TInValue> $array The array to import
- * @param bool $save_indexes [optional] Try to save the numeric indexes used in the original array.
- *
- * @return SplFixedArray<TInValue> 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<int, TValue>
-
- * @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<int, TValue>
- */
-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<int, TValue>
- */
-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<int, TValue>
- */
-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<TValue>
- */
-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<TValue>
- */
-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<int, TValue>
- */
-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<TObject, TArrayValue>
- * @template-implements Iterator<int, TObject>
- */
-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<TObject, TArrayValue> $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<TObject, TArrayValue> $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<TObject, TArrayValue> $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 <type>object</type>
- * @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 8c479ce..0000000
--- a/vendor/vimeo/psalm/stubs/Xdebug.phpstub
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-const XDEBUG_TRACE_APPEND = 1;
-const XDEBUG_TRACE_COMPUTERIZED = 2;
-const XDEBUG_TRACE_HTML = 4;
-const XDEBUG_TRACE_NAKED_FILENAME = 8;
-const XDEBUG_CC_UNUSED = 1;
-const XDEBUG_CC_DEAD_CODE = 2;
-const XDEBUG_CC_BRANCH_CHECK = 4;
-const XDEBUG_STACK_NO_DESC = 1;
-const XDEBUG_FILTER_TRACING = 256;
-const XDEBUG_FILTER_CODE_COVERAGE = 512;
-const XDEBUG_FILTER_NONE = 0;
-const XDEBUG_PATH_WHITELIST = 1;
-const XDEBUG_PATH_BLACKLIST = 2;
-const XDEBUG_NAMESPACE_WHITELIST = 17;
-const XDEBUG_NAMESPACE_BLACKLIST = 18;
-
-function xdebug_code_coverage_started() : bool
-{
-}
-
-/**
-* @return array<string, array<int, int>>
-*/
-function xdebug_get_code_coverage() : array
-{
-}
-
-/**
-* @param array<int, string> $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 90b329d..0000000
--- a/vendor/vimeo/psalm/stubs/decimal.phpstub
+++ /dev/null
@@ -1,492 +0,0 @@
-<?php
-namespace Decimal;
-
-/**
- * Copied from https://github.com/php-decimal/stubs/blob/master/Decimal.php
- *
- * The MIT License (MIT)
- * Copyright (c) 2018 Rudi Theunissen
- *
- * 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.
- */
-
-final class Decimal implements \JsonSerializable
-{
- /**
- * These constants are for auto-complete only.
- */
- const ROUND_UP = 101; /* Round away from zero. */
- const ROUND_DOWN = 102; /* Round towards zero. */
- const ROUND_CEILING = 103; /* Round towards positive infinity */
- const ROUND_FLOOR = 104; /* Round towards negative infinity */
- const ROUND_HALF_UP = 105; /* Round to nearest, ties away from zero. */
- const ROUND_HALF_DOWN = 106; /* Round to nearest, ties towards zero. */
- const ROUND_HALF_EVEN = 107; /* Round to nearest, ties towards even. */
- const ROUND_HALF_ODD = 108; /* Round to nearest, ties towards odd. */
- const ROUND_TRUNCATE = 109; /* Truncate, keeping infinity. */
-
- const DEFAULT_ROUNDING = Decimal::ROUND_HALF_EVEN;
- const DEFAULT_PRECISION = 28;
-
- const MIN_PRECISION = 1;
- const MAX_PRECISION = 0; /* This value may change across platforms */
-
- /**
- * Constructor
- *
- * Initializes a new instance using a given value and minimum precision.
- *
- * @param Decimal|string|int $value
- * @param int $precision
- *
- * @throws \BadMethodCallException if already constructed.
- * @throws \TypeError if the value is not a decimal, string, or integer.
- * @throws \DomainException is the type is supported but the value could not
- * be converted to decimal.
- */
- public function __construct($value, int $precision = Decimal::DEFAULT_PRECISION) {}
-
- /**
- * Sum
- *
- * The precision of the result will be the max of all precisions that were
- * encountered during the calculation. The given precision should therefore
- * be considered the minimum precision of the result.
- *
- * This method is equivalent to adding each value individually.
- *
- * @param array|\Traversable $values
- * @param int $precision Minimum precision of the sum.
- *
- * @return Decimal the sum of all given values.
- *
- * @throws \TypeError if an unsupported type is encountered.
- * @throws \ArithmeticError if addition is undefined, eg. INF + -INF
- */
- public static function sum($values, int $precision = Decimal::DEFAULT_PRECISION): Decimal {}
-
- /**
- * Average
- *
- * The precision of the result will be the max of all precisions that were
- * encountered during the calculation. The given precision should therefore
- * be considered the minimum precision of the result.
- *
- * This method is equivalent to adding each value individually,
- * then dividing by the number of values.
- *
- * @param array|\Traversable $values
- * @param int $precision Minimum precision of the average.
- *
- * @return Decimal the average of all given values.
- *
- * @throws \TypeError if an unsupported type is encountered.
- * @throws \ArithmeticError if addition is undefined, eg. INF + -INF
- */
- public static function avg($values, int $precision = Decimal::DEFAULT_PRECISION): Decimal {}
-
- /**
- * Copy
- *
- * @param int $precision The precision of the return value, which defaults
- * to the precision of this decimal.
- *
- * @return Decimal a copy of this decimal.
- */
- public function copy(int $precision = null): Decimal {}
-
- /**
- * Add
- *
- * This method is equivalent to the `+` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the result of adding this decimal to the given value.
- *
- * @throws \TypeError if the value is not a decimal, string or integer.
- */
- public function add($value): Decimal {}
-
- /**
- * Subtract
- *
- * This method is equivalent to the `-` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the result of subtracting a given value from this decimal.
- *
- * @throws \TypeError if the value is not a decimal, string or integer.
- */
- public function sub($value): Decimal {}
-
- /**
- * Multiply
- *
- * This method is equivalent to the `*` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the result of multiplying this decimal by the given value.
- *
- * @throws \TypeError if the given value is not a decimal, string or integer.
- */
- public function mul($value): Decimal {}
-
- /**
- * Divide
- *
- * This method is equivalent to the `/` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the result of dividing this decimal by the given value.
- *
- * @throws \TypeError if the value is not a decimal, string or integer.
- * @throws \DivisionByZeroError if dividing by zero.
- * @throws \ArithmeticError if division is undefined, eg. INF / -INF
- */
- public function div($value): Decimal {}
-
- /**
- * Modulo (integer)
- *
- * This method is equivalent to the `%` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @see Decimal::rem for the decimal remainder.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the remainder after dividing the integer value of this
- * decimal by the integer value of the given value
- *
- * @throws \TypeError if the value is not a decimal, string or integer.
- * @throws \DivisionByZeroError if the integer value of $value is zero.
- * @throws \ArithmeticError if the operation is undefined, eg. INF % -INF
- */
- public function mod($value): Decimal {}
-
- /**
- * Remainder
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $value
- *
- * @return Decimal the remainder after dividing this decimal by a given value.
- *
- * @throws \TypeError if the value is not a decimal, string or integer.
- * @throws \DivisionByZeroError if the integer value of $value is zero.
- * @throws \ArithmeticError if the operation is undefined, eg. INF, -INF
- */
- public function rem($value): Decimal {}
-
- /**
- * Power
- *
- * This method is equivalent to the `**` operator.
- *
- * The precision of the result will be the max of this decimal's precision
- * and the given value's precision, where scalar values assume the default.
- *
- * @param Decimal|string|int $exponent The power to raise this decimal to.
- *
- * @return Decimal the result of raising this decimal to a given power.
- *
- * @throws \TypeError if the exponent is not a decimal, string or integer.
- */
- public function pow($exponent): Decimal {}
-
- /**
- * Natural logarithm
- *
- * This method is equivalent in function to PHP's `log`.
- *
- * @return Decimal the natural logarithm of this decimal (log base e),
- * with the same precision as this decimal.
- */
- public function ln(): Decimal {}
-
- /**
- * Exponent
- *
- * @return Decimal the exponent of this decimal, ie. e to the power of this,
- * with the same precision as this decimal.
- */
- public function exp(): Decimal {}
-
- /**
- * Base-10 logarithm
- *
- * @return Decimal the base-10 logarithm of this decimal, with the same
- * precision as this decimal.
- */
- public function log10(): Decimal {}
-
- /**
- * Square root
- *
- * @return Decimal the square root of this decimal, with the same precision
- * as this decimal.
- */
- public function sqrt(): Decimal {}
-
- /**
- * Floor
- *
- * @return Decimal the closest integer towards negative infinity.
- */
- public function floor(): Decimal {}
-
- /**
- * Ceiling
- *
- * @return Decimal the closest integer towards positive infinity.
- */
- public function ceil(): Decimal {}
-
- /**
- * Truncate
- *
- * @return Decimal the integer value of this decimal.
- */
- public function truncate(): Decimal {}
-
- /**
- * Round
- *
- * @param int $places The number of places behind the decimal to round to.
- * @param int $mode The rounding mode, which are constants of Decimal.
- *
- * @return Decimal the value of this decimal with the same precision,
- * rounded according to the specified number of decimal
- * places and rounding mode
- *
- * @throws \InvalidArgumentException if the rounding mode is not supported.
- */
- public function round(int $places = 0, int $mode = Decimal::DEFAULT_ROUNDING): Decimal {}
-
- /**
- * Decimal point shift.
- *
- * @param int $places The number of places to shift the decimal point by.
- * A positive shift moves the decimal point to the right,
- * a negative shift moves the decimal point to the left.
- *
- * @return Decimal A copy of this decimal with its decimal place shifted.
- */
- public function shift(int $places): Decimal {}
-
- /**
- * Trims trailing zeroes.
- *
- * @return Decimal A copy of this decimal without trailing zeroes.
- */
- public function trim(): Decimal {}
-
- /**
- * Precision
- *
- * @return int the precision of this decimal.
- */
- public function precision(): int {}
-
- /**
- * Signum
- *
- * @return int 0 if zero, -1 if negative, or 1 if positive.
- */
- public function signum(): int {}
-
- /**
- * Parity (integer)
- *
- * @return int 0 if the integer value of this decimal is even, 1 if odd.
- * Special numbers like NAN and INF will return 1.
- */
- public function parity(): int {}
-
- /**
- * Absolute
- *
- * @return Decimal the absolute (positive) value of this decimal.
- */
- public function abs(): Decimal {}
-
- /**
- * Negate
- *
- * @return Decimal the same value as this decimal, but the sign inverted.
- */
- public function negate(): Decimal {}
-
- /**
- * @return bool TRUE if this decimal is an integer and even, FALSE otherwise.
- */
- public function isEven(): bool {}
-
- /**
- * @return bool TRUE if this decimal is an integer and odd, FALSE otherwise.
- */
- public function isOdd(): bool {}
-
- /**
- * @return bool TRUE if this decimal is positive, FALSE otherwise.
- */
- public function isPositive(): bool {}
-
- /**
- * @return bool TRUE if this decimal is negative, FALSE otherwise.
- */
- public function isNegative(): bool {}
-
- /**
- * @return bool TRUE if this decimal is not a defined number.
- */
- public function isNaN(): bool {}
-
- /**
- * @return bool TRUE if this decimal represents infinity, FALSE otherwise.
- */
- public function isInf(): bool {}
-
- /**
- * @return bool TRUE if this decimal is an integer, ie. does not have
- * significant figures behind the decimal point, otherwise FALSE.
- */
- public function isInteger(): bool {}
-
- /**
- * @return bool TRUE if this decimal is either positive or negative zero.
- */
- public function isZero(): bool {}
-
- /**
- * @param int $places The number of places behind the decimal point.
- * @param bool $commas TRUE if thousands should be separated by a comma.
- * @param int $rounding
- *
- * @return string the value of this decimal formatted to a fixed number of
- * decimal places, optionally with thousands comma-separated,
- * using a given rounding mode.
- */
- public function toFixed(int $places = 0, bool $commas = false, int $rounding = Decimal::DEFAULT_ROUNDING): string {}
-
- /**
- * String representation.
- *
- * This method is equivalent to a cast to string.
- *
- * This method should not be used as a canonical representation of this
- * decimal, because values can be represented in more than one way. However,
- * this method does guarantee that a decimal instantiated by its output with
- * the same precision will be exactly equal to this decimal.
- *
- * @return string the value of this decimal represented exactly, in either
- * fixed or scientific form, depending on the value.
- */
- public function toString(): string {}
-
- /**
- * Integer representation.
- *
- * This method is equivalent to a cast to int.
- *
- * @return int the integer value of this decimal.
- *
- * @throws \OverflowException if the value is greater than PHP_INT_MAX.
- */
- public function toInt(): int {}
-
- /**
- * Binary floating point representation.
- *
- * This method is equivalent to a cast to float, and is not affected by the
- * 'precision' INI setting.
- *
- * @return float the native PHP floating point value of this decimal.
- *
- * @throws \OverflowException if the value is greater than PHP_FLOAT_MAX.
- * @throws \UnderflowException if the value is smaller than PHP_FLOAT_MIN.
- */
- public function toFloat(): float {}
-
- /**
- * Equality
- *
- * This method is equivalent to the `==` operator.
- *
- * @param mixed $other
- *
- * @return bool TRUE if this decimal is considered equal to the given value.
- * Equal decimal values tie-break on precision.
- */
- public function equals($other): bool {}
-
- /**
- * Ordering
- *
- * This method is equivalent to the `<=>` 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 7645084..0000000
--- a/vendor/vimeo/psalm/stubs/ext-apcu.phpstub
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-define('APC_LIST_ACTIVE', 1);
-define('APC_LIST_DELETED', 2);
-define('APC_ITER_TYPE', 1);
-define('APC_ITER_KEY', 2);
-define('APC_ITER_FILENAME', 4);
-define('APC_ITER_DEVICE', 8);
-define('APC_ITER_INODE', 16);
-define('APC_ITER_VALUE', 32);
-define('APC_ITER_MD5', 64);
-define('APC_ITER_NUM_HITS', 128);
-define('APC_ITER_MTIME', 256);
-define('APC_ITER_CTIME', 512);
-define('APC_ITER_DTIME', 1024);
-define('APC_ITER_ATIME', 2048);
-define('APC_ITER_REFCOUNT', 4096);
-define('APC_ITER_MEM_SIZE', 8192);
-define('APC_ITER_TTL', 16384);
-define('APC_ITER_NONE', 0);
-define('APC_ITER_ALL', -1);
-
-class APCUIterator implements Iterator
-{
- /**
- * @param array<string>|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 04eef4d..0000000
--- a/vendor/vimeo/psalm/stubs/ext-ds.phpstub
+++ /dev/null
@@ -1,1434 +0,0 @@
-<?php
-
-namespace Ds;
-
-use ArrayAccess;
-use Countable;
-use JsonSerializable;
-use OutOfBoundsException;
-use OutOfRangeException;
-use Traversable;
-use UnderflowException;
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- * @extends Traversable<TKey, TValue>
- */
-interface Collection extends Traversable, Countable, JsonSerializable
-{
- /**
- * @return Collection<TKey, TValue>
- * @psalm-mutation-free
- */
- public function copy(): Collection;
-
- /**
- * @return array<TKey, TValue>
- * @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<TValue>
- */
-final class Deque implements Sequence
-{
- /**
- * @param iterable<TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @return Deque<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Deque
- {
- }
-
- /**
- * @return list<TValue>
- * @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<TValue>
- * @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<TNewValue>
- * @psalm-mutation-free
- */
- public function map(callable $callback): Deque
- {
- }
-
- /**
- * @template TValue2
- * @param iterable<TValue2> $values
- * @return Deque<TValue|TValue2>
- * @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<TValue>
- * @psalm-mutation-free
- */
- public function reversed(): Deque
- {
- }
-
- /**
- * @return TValue
- * @throws \UnderflowException
- */
- public function shift()
- {
- }
-
- /**
- * @return Deque<TValue>
- * @psalm-mutation-free
- */
- public function slice(int $offset, ?int $length = null): Deque
- {
- }
-
- /**
- * @param (callable(TValue, TValue): int)|null $comparator
- * @return Deque<TValue>
- * @psalm-mutation-free
- */
- public function sorted(callable $comparator = null): Deque
- {
- }
-}
-
-/**
- * @template TKey
- * @template TValue
- * @implements Collection<TKey, TValue>
- * @implements ArrayAccess<TKey, TValue>
- */
-final class Map implements Collection, ArrayAccess
-{
- /**
- * @param iterable<TKey, TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @psalm-mutation-free
- */
- public function allocate(int $capacity): void
- {
- }
-
- /**
- * @psalm-mutation-free
- */
- public function capacity(): int
- {
- }
-
- /**
- * @return Map<TKey, TValue>
- * @psalm-mutation-free
- */
- public function copy(): Map
- {
- }
-
- /**
- * @return array<TKey, TValue>
- * @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<TKey, TValue>
- * @throws UnderflowException
- * @psalm-mutation-free
- */
- public function first(): Pair
- {
- }
-
- /**
- * @return Pair<TKey, TValue>
- * @throws UnderflowException
- * @psalm-mutation-free
- */
- public function last(): Pair
- {
- }
-
- /**
- * @return Pair<TKey, TValue>
- * @throws OutOfRangeException
- * @psalm-mutation-free
- */
- public function skip(int $position): Pair
- {
- }
-
- /**
- * @template TKey2
- * @template TValue2
- * @param iterable<TKey2, TValue2> $values
- * @return Map<TKey|TKey2, TValue|TValue2>
- * @psalm-mutation-free
- */
- public function merge(iterable $values): Map
- {
- }
-
- /**
- * @template TKey2
- * @template TValue2
- * @param Map<TKey2, TValue2> $map
- * @return Map<TKey&TKey2, TValue>
- * @psalm-mutation-free
- */
- public function intersect(Map $map): Map
- {
- }
-
- /**
- * @template TValue2
- * @param Map<TKey, TValue2> $map
- * @return Map<TKey, TValue>
- * @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<TKey, TValue>
- * @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<TKey>
- * @psalm-mutation-free
- */
- public function keys(): Set
- {
- }
-
- /**
- * @template TNewValue
- * @param callable(TKey, TValue): TNewValue $callback
- * @return Map<TKey, TNewValue>
- * @psalm-mutation-free
- */
- public function map(callable $callback): Map
- {
- }
-
- /**
- * @return Sequence<Pair<TKey, TValue>>
- * @psalm-mutation-free
- */
- public function pairs(): Sequence
- {
- }
-
- /**
- * @param TKey $key
- * @param TValue $value
- */
- public function put($key, $value)
- {
- }
-
- /**
- * @param iterable<TKey, TValue> $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<TKey, TValue>
- * @psalm-mutation-free
- */
- public function reversed(): Map
- {
- }
-
- /**
- * @return Map<TKey, TValue>
- * @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<TKey, TValue>
- * @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<TKey, TValue>
- * @psalm-mutation-free
- */
- public function ksorted(callable $comparator = null): Map
- {
- }
-
- /**
- * @return Sequence<TValue>
- * @psalm-mutation-free
- */
- public function values(): Sequence
- {
- }
-
- /**
- * @template TKey2
- * @template TValue2
- * @param Map<TKey2, TValue2> $map
- * @return Map<TKey|TKey2, TValue|TValue2>
- * @psalm-mutation-free
- */
- public function union(Map $map): Map
- {
- }
-
- /**
- * @template TKey2
- * @template TValue2
- * @param Map<TKey2, TValue2> $map
- * @return Map<TKey|TKey2, TValue|TValue2>
- * @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<TKey, TValue>
- * @psalm-mutation-free
- */
- public function copy(): Pair
- {
- }
-}
-
-/**
- * @template TValue
- * @extends Collection<int, TValue>
- * @extends ArrayAccess<int, TValue>
- */
-interface Sequence extends Collection, ArrayAccess
-{
- /**
- * @return Sequence<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Sequence;
-
- /**
- * @return list<TValue>
- * @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<TValue>
- * @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<TNewValue>
- * @psalm-mutation-free
- */
- public function map(callable $callback): Sequence;
-
- /**
- * @template TValue2
- * @param iterable<TValue2> $values
- * @return Sequence<TValue|TValue2>
- * @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<TValue>
- * @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<TValue>
- * @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<TValue>
- * @psalm-mutation-free
- */
- public function sorted(callable $comparator = null): Sequence;
-
- /**
- * @param TValue ...$values
- */
- public function unshift(...$values);
-}
-
-
-/**
- * @template TValue
- * @implements Sequence<TValue>
- */
-final class Vector implements Sequence
-{
- /**
- * @param iterable<TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @return Vector<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Vector
- {
- }
-
- /**
- * @return list<TValue>
- * @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<TValue>
- * @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<TNewValue>
- * @psalm-mutation-free
- */
- public function map(callable $callback): Vector
- {
- }
-
- /**
- * @template TValue2
- * @param iterable<TValue2> $values
- * @return Vector<TValue|TValue2>
- * @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<TValue>
- * @psalm-mutation-free
- */
- public function reversed(): Vector
- {
- }
-
- /**
- * @return TValue
- * @throws \UnderflowException
- */
- public function shift()
- {
- }
-
- /**
- * @return Vector<TValue>
- * @psalm-mutation-free
- */
- public function slice(int $offset, ?int $length = null): Vector
- {
- }
-
- /**
- * @param (callable(TValue, TValue): int)|null $comparator
- * @return Vector<TValue>
- * @psalm-mutation-free
- */
- public function sorted(callable $comparator = null): Vector
- {
- }
-}
-
-/**
- * @template TValue
- * @implements Collection<int, TValue>
- * @implements ArrayAccess<int, TValue>
- */
-final class Set implements Collection, ArrayAccess
-{
- /**
- * @param iterable<TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @return Set<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Set
- {
- }
-
- /**
- * @return list<TValue>
- * @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<TValue2> $set
- * @return Set<TValue>
- * @psalm-mutation-free
- */
- public function diff(Set $set): Set
- {
- }
-
- /**
- * @param (callable(TValue): bool)|null $callback
- * @return Set<TValue>
- * @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<TValue2> $set
- * @return Set<TValue&TValue2>
- * @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<TNewValue>
- */
- public function map(callable $callback): Set
- {
- }
-
- /**
- * @template TValue2
- * @param iterable<TValue2> $values
- * @return Set<TValue|TValue2>
- * @psalm-mutation-free
- */
- public function merge(iterable $values): Set
- {
- }
-
- /**
- * @param TValue ...$values
- */
- public function remove(...$values): void
- {
- }
-
- /**
- * @return Set<TValue>
- * @psalm-mutation-free
- */
- public function reversed(): Set
- {
- }
-
- /**
- * @return Set<TValue>
- * @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<TValue>
- * @psalm-mutation-free
- */
- public function sorted(callable $comparator = null): Set
- {
- }
-
- /**
- * @template TValue2
- * @param Set<TValue2> $set
- * @return Set<TValue|TValue2>
- * @psalm-mutation-free
- */
- public function union(Set $set): Set
- {
- }
-
- /**
- * @template TValue2
- * @param Set<TValue2> $set
- * @return Set<TValue|TValue2>
- * @psalm-mutation-free
- */
- public function xor(Set $set): Set
- {
- }
-}
-
-/**
- * @template TValue
- * @implements Collection<int, TValue>
- * @implements ArrayAccess<int, TValue>
- */
-final class Stack implements Collection, ArrayAccess
-{
- /**
- * @param iterable<TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @return Stack<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Stack
- {
- }
-
- /**
- * @return list<TValue>
- * @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<int, TValue>
- * @implements ArrayAccess<int, TValue>
- */
-final class Queue implements Collection, ArrayAccess
-{
- /**
- * @param iterable<TValue> $values
- */
- public function __construct(iterable $values = [])
- {
- }
-
- /**
- * @return Queue<TValue>
- * @psalm-mutation-free
- */
- public function copy(): Queue
- {
- }
-
- /**
- * @return list<TValue>
- * @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<int, TValue>
- */
-final class PriorityQueue implements Collection
-{
- /**
- * @return PriorityQueue<TValue>
- * @psalm-mutation-free
- */
- public function copy(): PriorityQueue
- {
- }
-
- /**
- * @return list<TValue>
- * @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 387d1c7..0000000
--- a/vendor/vimeo/psalm/stubs/ext-geos.phpstub
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-define('GEOSBUF_CAP_ROUND', 1);
-define('GEOSBUF_CAP_FLAT', 2);
-define('GEOSBUF_CAP_SQUARE', 3);
-define('GEOSBUF_JOIN_ROUND', 1);
-define('GEOSBUF_JOIN_MITRE', 2);
-define('GEOSBUF_JOIN_BEVEL', 3);
-
-define('GEOS_POINT', 0);
-define('GEOS_LINESTRING', 1);
-define('GEOS_LINEARRING', 2);
-define('GEOS_POLYGON', 3);
-define('GEOS_MULTIPOINT', 4);
-define('GEOS_MULTILINESTRING', 5);
-define('GEOS_MULTIPOLYGON', 6);
-define('GEOS_GEOMETRYCOLLECTION', 7);
-
-define('GEOSVALID_ALLOW_SELFTOUCHING_RING_FORMING_HOLE', 1);
-
-define('GEOSRELATE_BNR_MOD2', 1);
-define('GEOSRELATE_BNR_OGC', 1);
-define('GEOSRELATE_BNR_ENDPOINT', 2);
-define('GEOSRELATE_BNR_MULTIVALENT_ENDPOINT', 3);
-define('GEOSRELATE_BNR_MONOVALENT_ENDPOINT', 4);
diff --git a/vendor/vimeo/psalm/stubs/mongodb.phpstub b/vendor/vimeo/psalm/stubs/mongodb.phpstub
deleted file mode 100644
index ad6f34d..0000000
--- a/vendor/vimeo/psalm/stubs/mongodb.phpstub
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-namespace MongoDB\Driver;
-
-use Iterator;
-use Traversable;
-
-/**
- * @template-covariant TKey
- * @template-covariant TValue
- *
- * @template-extends Traversable<TKey, TValue>
- */
-interface CursorInterface extends Traversable
-{
- /**
- * @return array<TValue>
- */
- public function toArray();
-}
-
-/**
- * @template-covariant TValue of array|object
- *
- * @template-implements Iterator<int, TValue>
- * @template-implements CursorInterface<int, TValue>
- */
-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<TValue>
- */
- public function toArray() {}
-}
diff --git a/vendor/vimeo/psalm/stubs/mysqli.phpstub b/vendor/vimeo/psalm/stubs/mysqli.phpstub
deleted file mode 100644
index a5ec2f5..0000000
--- a/vendor/vimeo/psalm/stubs/mysqli.phpstub
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/**
- * @template TValue
- *
- * @template-implements Traversable<int, TValue>
- */
-class mysqli_result implements Traversable
-{
- /**
- * @psalm-taint-sink callable $class
- *
- * @template T of object
- * @param class-string<T> $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<TValue> $result
- * @param class-string<T> $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 0abf505..0000000
--- a/vendor/vimeo/psalm/stubs/pdo.phpstub
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-/**
- * @template TValue
- *
- * @template-implements Traversable<int, TValue>
- */
-class PDOStatement implements Traversable
-{
- /**
- * @psalm-taint-sink callable $class
- *
- * @template T of object
- * @param class-string<T> $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 834f8f6..0000000
--- a/vendor/vimeo/psalm/stubs/phpparser.phpstub
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php declare(strict_types=1);
-
-namespace PhpParser\Node\Expr;
-
-use PhpParser\Node\Arg;
-use PhpParser\Node\Expr;
-use PhpParser\Node\VariadicPlaceholder;
-
-abstract class CallLike extends Expr {
- /**
- * @return list<Arg|VariadicPlaceholder>
- */
- abstract public function getRawArgs(): array;
-
- public function isFirstClassCallable(): bool {}
-
- /**
- * @psalm-pure
- * @return list<Arg>
- */
- 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 791a0cf..0000000
--- a/vendor/vimeo/psalm/stubs/phpredis.phpstub
+++ /dev/null
@@ -1,548 +0,0 @@
-<?php
-
-/**
- * @generate-function-entries
- * @generate-legacy-arginfo
- */
-
-class Redis {
-
- public function __construct(array $options = null);
-
- public function _compress(string $value): string;
-
- public function __destruct();
-
- public function _pack(mixed $value): string;
-
- public function _prefix(string $key): string;
-
- public function _serialize(mixed $value): string;
-
- public function _uncompress(string $value): string;
-
- public function _unpack(string $value): mixed;
-
- public function _unserialize(string $value): mixed;
-
- /**
- * @param string $args
- * @return mixed|Redis
- */
- public function acl(string $subcmd, ...$args);
-
- /** @return int|Redis */
- public function append(string $key, mixed $value);
-
- public function auth(mixed $credentials): bool;
-
- public function bgSave(): bool;
-
- public function bgrewriteaof(): bool;
-
- /** @return int|Redis */
- public function bitcount(string $key, int $start = 0, int $end = -1);
-
- /**
- * @return int|Redis
- */
- public function bitop(string $operation, string $deskey, string $srckey, string ...$other_keys): int;
-
- /** @return int|Redis */
- public function bitpos(string $key, int $bit, int $start = 0, int $end = -1);
-
- public function blPop(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): array|null|false;
-
- public function brPop(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): array|null|false;
-
- public function brpoplpush(string $src, string $dst, int $timeout): Redis|string|false;
-
- public function bzPopMax(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): array;
-
- public function bzPopMin(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): array;
-
- public function clearLastError(): bool;
-
- public function client(string $opt, string $arg = null): mixed;
-
- public function close(): bool;
-
- public function command(string $opt = null, string|array $arg): mixed;
-
- public function config(string $operation, string $key, mixed $value = null): mixed;
-
- public function connect(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0, array $context = null): bool;
-
- public function copy(string $src, string $dst, array $options = null): bool;
-
- public function dbSize(): int;
-
- public function debug(string $key): string;
-
- /** @return int|Redis */
- public function decr(string $key, int $by = 1);
-
- /** @return int|Redis */
- public function decrBy(string $key, int $value);
-
- /**
- * @return int|Redis
- */
- public function del(array|string $key, string ...$other_keys);
-
- /**
- * @deprecated
- * @alias Redis::del
- * @return int|Redis
- */
- public function delete(array|string $key, string ...$other_keys);
-
- public function discard(): bool;
-
- public function dump(string $key): string;
-
- /** @return string|Redis */
- public function echo(string $str);
-
- public function eval(string $script, array $keys = null, int $num_keys = 0): mixed;
-
- public function evalsha(string $sha1, array $keys = null, int $num_keys = 0): mixed;
-
- public function exec(): Redis|array|false;
-
- /** @return int|Redis|bool */
- public function exists(mixed $key, mixed ...$other_keys);
-
- public function expire(string $key, int $timeout): Redis|bool;
-
- public function expireAt(string $key, int $timestamp): Redis|bool;
-
- public function flushAll(bool $async = false): bool;
-
- public function flushDB(bool $async = false): bool;
-
- public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples): int;
-
- public function geodist(string $key, string $src, string $dst, ?string $unit = null): Redis|float|false;
-
- public function geohash(string $key, string $member, string ...$other_members): array;
-
- public function geopos(string $key, string $member, string ...$other_members): Redis|array|false;
-
- public function georadius(string $key, float $lng, float $lat, float $radius, string $unit, array $options = []): Redis|mixed|false;
-
- public function georadius_ro(string $key, float $lng, float $lat, float $radius, string $unit, array $options = []): Redis|mixed|false;
-
- public function georadiusbymember(string $key, string $member, float $radius, string $unit, array $options = []): Redis|mixed|false;
-
- public function georadiusbymember_ro(string $key, string $member, float $radius, string $unit, array $options = []): Redis|mixed|false;
-
- public function geosearch(string $key, array|string $position, array|int|float $shape, string $unit, array $options = []): array;
-
- public function geosearchstore(string $dst, string $src, array|string $position, array|int|float $shape, string $unit, array $options = []): array;
-
- /** @return string|Redis */
- public function get(string $key);
-
- public function getAuth(): mixed;
-
- /** @return int|Redis */
- public function getBit(string $key, int $idx);
-
- public function getDBNum(): int;
-
- public function getHost(): string;
-
- public function getLastError(): ?string;
-
- public function getMode(): int;
-
- public function getOption(int $option): mixed;
-
- public function getPersistentID(): ?string;
-
- public function getPort(): int;
-
- /** @return string|Redis */
- public function getRange(string $key, int $start, int $end);
-
- public function getReadTimeout(): int;
-
- /** @return string|Redis */
- public function getset(string $key, mixed $value);
-
- public function getTimeout(): int;
-
- public function hDel(string $key, string $member, string ...$other_members): Redis|int|false;
-
- public function hExists(string $key, string $member): Redis|bool;
-
- public function hGet(string $key, string $member): Redis|mixed|false;
-
- public function hGetAll(string $key): Redis|array|false;
-
- public function hIncrBy(string $key, string $member, int $value): Redis|int|false;
-
- public function hIncrByFloat(string $key, string $member, float $value): Redis|float|false;
-
- public function hKeys(string $key): Redis|array|false;
-
- public function hLen(string $key): Redis|int|false;
-
- public function hMget(string $key, array $keys): Redis|array|false;
-
- public function hMset(string $key, array $keyvals): Redis|bool|false;
-
- public function hSet(string $key, string $member, mixed $value): Redis|int|false;
-
- public function hSetNx(string $key, string $member, string $value): Redis|bool;
-
- public function hStrLen(string $key, string $member): int;
-
- public function hVals(string $key): Redis|array|false;
-
- public function hscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): bool|array;
-
- /** @return int|Redis */
- public function incr(string $key, int $by = 1);
-
- /** @return int|Redis */
- public function incrBy(string $key, int $value);
-
- /** @return int|Redis */
- public function incrByFloat(string $key, float $value);
-
- public function info(string $opt = null): Redis|array|false;
-
- public function isConnected(): bool;
-
- /** @return array|Redis */
- public function keys(string $pattern);
-
- /**
- * @param mixed $elements
- * @return int|Redis
- */
- public function lInsert(string $key, string $pos, mixed $pivot, mixed $value);
-
-
- public function lLen(string $key): Redis|int|false;
-
- public function lMove(string $src, string $dst, string $wherefrom, string $whereto): string;
-
- /** @return string|Redis */
- public function lPop(string $key);
-
- /**
- * @param mixed $elements
- * @return int|Redis
- */
- public function lPush(string $key, ...$elements);
-
- /**
- * @param mixed $elements
- * @return int|Redis
- */
- public function rPush(string $key, ...$elements);
-
- /** @return int|Redis */
- public function lPushx(string $key, mixed $value);
-
- /** @return int|Redis */
- public function rPushx(string $key, mixed $value);
-
- public function lSet(string $key, int $index, mixed $value): Redis|bool;
-
- public function lastSave(): int;
-
- public function lindex(string $key, int $index): Redis|mixed|false;
-
- public function lrange(string $key, int $start , int $end): Redis|array|false;
-
- /**
- * @return int|Redis|false
- */
- public function lrem(string $key, mixed $value, int $count = 0);
-
- public function ltrim(string $key, int $start , int $end): Redis|bool;
-
- /** @return array|Redis */
- public function mget(array $keys);
-
- public function migrate(string $host, int $port, string $key, string $dst, int $timeout, bool $copy = false, bool $replace = false): bool;
-
- public function move(string $key, int $index): bool;
-
- public function mset(array $key_values): Redis|bool;
-
- public function msetnx(array $key_values): Redis|bool;
-
- public function multi(int $value = Redis::MULTI): bool|Redis;
-
- public function object(string $subcommand, string $key): Redis|int|string|false;
-
- /**
- * @deprecated
- * @alias Redis::connect
- */
- public function open(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool;
-
- public function pconnect(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool;
-
-public function persist(string $key): bool;
-
- public function pexpire(string $key, int $timeout): bool;
-
- public function pexpireAt(string $key, int $timestamp): bool;
-
- public function pfadd(string $key, array $elements): int;
-
- public function pfcount(string $key): int;
-
- public function pfmerge(string $dst, array $keys): bool;
-
- /** @return string|Redis */
- public function ping(string $key = NULL);
-
- public function pipeline(): bool|Redis;
-
- /**
- * @deprecated
- * @alias Redis::pconnect
- */
- public function popen(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool;
-
- /** @return bool|Redis */
- public function psetex(string $key, int $expire, mixed $value);
-
- public function psubscribe(array $patterns): void;
-
- public function pttl(string $key): Redis|int|false;
-
- public function publish(string $channel, string $message): mixed;
-
- public function pubsub(string $command, mixed $arg = null): mixed;
-
- public function punsubscribe(array $patterns): array;
-
- /** @return string|Redis */
- public function rPop(string $key);
-
- /** @return string|Redis */
- public function randomKey();
-
- public function rawcommand(string $command, mixed ...$args): mixed;
-
- /** @return bool|Redis */
- public function rename(string $key_src, string $key_dst);
-
- /** @return bool|Redis */
- public function renameNx(string $key_src, string $key_dst);
-
- public function restore(string $key, int $timeout, string $value): bool;
-
- public function role(): mixed;
-
- public function rpoplpush(string $src, string $dst): Redis|string|false;
-
- public function sAdd(string $key, mixed $value, mixed ...$other_values): Redis|int|false;
-
- public function sAddArray(string $key, array $values): int;
-
- public function sDiff(string $key, string ...$other_keys): Redis|array|false;
-
- public function sDiffStore(string $dst, string $key, string ...$other_keys): Redis|int|false;
-
- public function sInter(array|string $key, string ...$other_keys): Redis|array|false;
-
- public function sInterStore(array|string $key, string ...$other_keys): Redis|int|false;
-
- public function sMembers(string $key): Redis|array|false;
-
- public function sMisMember(string $key, string $member, string ...$other_members): array;
-
- public function sMove(string $src, string $dst, mixed $value): Redis|bool;
-
- public function sPop(string $key, int $count = 0): Redis|string|array|false;
-
- public function sRandMember(string $key, int $count = 0): Redis|string|array|false;
-
- public function sUnion(string $key, string ...$other_keys): Redis|array|false;
-
- public function sUnionStore(string $dst, string $key, string ...$other_keys): Redis|int|false;
-
- public function save(): bool;
-
- public function scan(?int &$iterator, ?string $pattern = null, int $count = 0, string $type = NULL): array|false;
-
- public function scard(string $key): Redis|int|false;
-
- public function script(string $command, mixed ...$args): mixed;
-
- public function select(int $db): bool;
-
- /** @return bool|Redis */
- public function set(string $key, mixed $value, mixed $opt = NULL);
-
- /** @return int|Redis */
- public function setBit(string $key, int $idx, bool $value);
-
- /** @return int|Redis */
- public function setRange(string $key, int $start, string $value);
-
-
- public function setOption(int $option, mixed $value): bool;
-
- /** @return bool|Redis */
- public function setex(string $key, int $expire, mixed $value);
-
- /** @return bool|array|Redis */
- public function setnx(string $key, mixed $value);
-
- public function sismember(string $key, mixed $value): Redis|bool;
-
- public function slaveof(string $host = null, int $port = 6379): bool;
-
- public function slowlog(string $mode, int $option = 0): mixed;
-
- public function sort(string $key, array $options = null): mixed;
-
- /**
- * @deprecated
- */
- public function sortAsc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array;
-
- /**
- * @deprecated
- */
- public function sortAscAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array;
-
- /**
- * @deprecated
- */
- public function sortDesc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array;
-
- /**
- * @deprecated
- */
- public function sortDescAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array;
-
- public function srem(string $key, mixed $value, mixed ...$other_values): Redis|int|false;
-
- public function sscan(string $key, int &$iterator, ?string $pattern = null, int $count = 0): array|false;
-
- /** @return int|Redis */
- public function strlen(string $key);
-
- public function subscribe(string $channel, string ...$other_channels): array;
-
- public function swapdb(string $src, string $dst): bool;
-
- public function time(): array;
-
- public function ttl(string $key): Redis|int|false;
-
- /** @return int|Redis */
- public function type(string $key);
-
- /**
- * @return int|Redis
- */
- public function unlink(array|string $key, string ...$other_keys);
-
- public function unsubscribe(string $channel, string ...$other_channels): array;
-
- /** @return bool|Redis */
- public function unwatch();
-
- /**
- * @return bool|Redis
- */
- public function watch(array|string $key, string ...$other_keys);
-
- public function wait(int $count, int $timeout): int|false;
-
- public function xack(string $key, string $group, array $ids): int|false;
-
- public function xadd(string $key, string $id, array $values, int $maxlen = 0, bool $approx = false): string|false;
-
- public function xclaim(string $key, string $group, string $consumer, int $min_iddle, array $ids, array $options): string|array;
-
- public function xdel(string $key, array $ids): Redis|int|false;
-
- public function xgroup(string $operation, string $key = null, string $arg1 = null, string $arg2 = null, bool $arg3 = false): mixed;
-
- public function xinfo(string $operation, ?string $arg1 = null, ?string $arg2 = null, int $count = -1): mixed;
-
- public function xlen(string $key): int;
-
- public function xpending(string $key, string $group, string $start = null, string $end = null, int $count = -1, string $consumer = null): Redis|array|false;
-
- public function xrange(string $key, string $start, string $end, int $count = -1): bool|array;
-
- public function xread(array $streams, int $count = -1, int $block = -1): bool|array;
-
- public function xreadgroup(string $group, string $consumer, array $streams, int $count = 1, int $block = 1): bool|array;
-
- public function xrevrange(string $key, string $start, string $end, int $count = -1): bool|array;
-
- public function xtrim(string $key, int $maxlen, bool $approx = false): int;
-
- public function zAdd(string $key, array|float $score_or_options, mixed ...$more_scores_and_mems): Redis|int|false;
-
- public function zCard(string $key): Redis|int|false;
-
- public function zCount(string $key, string $start , string $end): Redis|int|false;
-
- public function zIncrBy(string $key, float $value, mixed $member): Redis|float|false;
-
- public function zLexCount(string $key, string $min, string $max): Redis|int|false;
-
- public function zMscore(string $key, string $member, string ...$other_members): array;
-
- public function zPopMax(string $key, int $value = null): array;
-
- public function zPopMin(string $key, int $value = null): array;
-
- public function zRange(string $key, int $start, int $end, mixed $scores = null): Redis|array|false;
-
- public function zRangeByLex(string $key, string $min, string $max, int $offset = -1, int $count = -1): array;
-
- public function zRangeByScore(string $key, string $start, string $end, array $options = []): Redis|array|false;
-
- public function zRandMember(string $key, array $options = null): string|array;
-
- public function zRank(string $key, mixed $member): Redis|int|false;
-
- public function zRem(mixed $key, mixed $member, mixed ...$other_members): Redis|int|false;
-
- public function zRemRangeByLex(string $key, string $min, string $max): int;
-
- public function zRemRangeByRank(string $key, int $start, int $end): Redis|int|false;
-
- public function zRemRangeByScore(string $key, string $start, string $end): Redis|int|false;
-
- public function zRevRange(string $key, int $start, int $end, mixed $scores = null): Redis|array|false;
-
- public function zRevRangeByLex(string $key, string $min, string $max, int $offset = -1, int $count = -1): array;
-
- public function zRevRangeByScore(string $key, string $start, string $end, array $options = []): array;
-
- public function zRevRank(string $key, mixed $member): Redis|int|false;
-
- public function zScore(string $key, mixed $member): Redis|float|false;
-
- public function zdiff(array $keys, array $options = null): array;
-
- public function zdiffstore(string $dst, array $keys, array $options = null): int;
-
- public function zinter(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false;
-
- public function zinterstore(string $dst, array $keys, ?array $weights = null, ?string $aggregate = null): Redis|int|false;
-
- public function zscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): bool|array;
-
- public function zunion(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false;
-
- public function zunionstore(string $dst, array $keys, ?array $weights = NULL, ?string $aggregate = NULL): Redis|int|false;
-}
diff --git a/vendor/vimeo/psalm/stubs/soap.phpstub b/vendor/vimeo/psalm/stubs/soap.phpstub
deleted file mode 100644
index 0eb1078..0000000
--- a/vendor/vimeo/psalm/stubs/soap.phpstub
+++ /dev/null
@@ -1,284 +0,0 @@
-<?php
-
-/**
- * The SoapClient class provides a client for SOAP 1.1, SOAP 1.2 servers. It can be used in WSDL
- * or non-WSDL mode.
- * @link https://php.net/manual/en/class.soapclient.php
- */
-class SoapClient {
-
- /**
- * SoapClient constructor
- * @link https://php.net/manual/en/soapclient.soapclient.php
- * @param mixed $wsdl <p>
- * URI of the WSDL file or <b>NULL</b> if working in
- * non-WSDL mode.
- * </p>
- * <p>
- * During development, WSDL caching may be disabled by the
- * use of the soap.wsdl_cache_ttl <i>php.ini</i> setting
- * otherwise changes made to the WSDL file will have no effect until
- * soap.wsdl_cache_ttl is expired.
- * </p>
- * @param array $options [optional] <p>
- * 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.
- * </p>
- * <p>
- * The style and use options only work in
- * non-WSDL mode. In WSDL mode, they come from the WSDL file.
- * </p>
- * <p>
- * The soap_version option should be one of either
- * <b>SOAP_1_1</b> or <b>SOAP_1_2</b> to
- * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used.
- * </p>
- * <p>
- * 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
- * <b>SOAP_AUTHENTICATION_BASIC</b> (default) or
- * <b>SOAP_AUTHENTICATION_DIGEST</b>.
- * </p>
- * <p>
- * The compression option allows to use compression
- * of HTTP SOAP requests and responses.
- * </p>
- * <p>
- * 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.
- * </p>
- * <p>
- * The trace option enables tracing of request so faults
- * can be backtraced. This defaults to <b>FALSE</b>
- * </p>
- * <p>
- * 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.
- * </p>
- * <p>
- * Setting the boolean trace option enables use of the
- * methods
- * SoapClient->__getLastRequest,
- * SoapClient->__getLastRequestHeaders,
- * SoapClient->__getLastResponse and
- * SoapClient->__getLastResponseHeaders.
- * </p>
- * <p>
- * The exceptions option is a boolean value defining whether
- * soap errors throw exceptions of type
- * SoapFault.
- * </p>
- * <p>
- * 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.
- * </p>
- * <p>
- * 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).
- * </p>
- * <p>
- * The cache_wsdl option is one of
- * <b>WSDL_CACHE_NONE</b>,
- * <b>WSDL_CACHE_DISK</b>,
- * <b>WSDL_CACHE_MEMORY</b> or
- * <b>WSDL_CACHE_BOTH</b>.
- * </p>
- * <p>
- * The user_agent option specifies string to use in
- * User-Agent header.
- * </p>
- * <p>
- * The stream_context option is a resource
- * for context.
- * </p>
- * <p>
- * The features option is a bitmask of
- * <b>SOAP_SINGLE_ELEMENT_ARRAYS</b>,
- * <b>SOAP_USE_XSI_ARRAY_TYPE</b>,
- * <b>SOAP_WAIT_ONE_WAY_CALLS</b>.
- * </p>
- * <p>
- * The keep_alive option is a boolean value defining whether
- * to send the Connection: Keep-Alive header or
- * Connection: close.
- * </p>
- * <p>
- * The ssl_method option is one of
- * <b>SOAP_SSL_METHOD_TLS</b>,
- * <b>SOAP_SSL_METHOD_SSLv2</b>,
- * <b>SOAP_SSL_METHOD_SSLv3</b> or
- * <b>SOAP_SSL_METHOD_SSLv23</b>.
- * </p>
- * @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 <p>
- * The name of the SOAP function to call.
- * </p>
- * @param array $arguments <p>
- * 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.
- * </p>
- * @param array $options [optional] <p>
- * An associative array of options to pass to the client.
- * </p>
- * <p>
- * The location option is the URL of the remote Web service.
- * </p>
- * <p>
- * The uri option is the target namespace of the SOAP service.
- * </p>
- * <p>
- * The soapaction option is the action to call.
- * </p>
- * @param mixed $input_headers [optional] <p>
- * An array of headers to be sent along with the SOAP request.
- * </p>
- * @param array $output_headers [optional] <p>
- * If supplied, this array will be filled with the headers from the SOAP response.
- * </p>
- * @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.
- * </p>
- * <p>
- * On error, if the SoapClient object was constructed with the exceptions
- * option set to <b>FALSE</b>, 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 <p>
- * The name of the cookie.
- * </p>
- * @param string $value [optional] <p>
- * The value of the cookie. If not specified, the cookie will be deleted.
- * </p>
- * @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] <p>
- * The new endpoint URL.
- * </p>
- * @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] <p>
- * The headers to be set. It could be <b>SoapHeader</b>
- * object or array of <b>SoapHeader</b> objects.
- * If not specified or set to <b>NULL</b>, the headers will be deleted.
- * </p>
- * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
- * @since 5.0.5
- */
- public function __setSoapHeaders ($soapheaders = null) {}
-
-}